Загрузка весеннего файла в смешанной форме - PullRequest
11 голосов
/ 03 февраля 2010

Я хочу загрузить файл в мое приложение Spring 3.0 (созданное с помощью roo).

У меня уже есть следующая сущность:

@Entity
@RooJavaBean
@RooToString
@RooEntity
public class SelniumFile {

    @ManyToOne(targetEntity = ShowCase.class)
    @JoinColumn
    private ShowCase showcase;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] file;

    @NotNull
    private String name;
}

Но я не уверен, как реализоватьэто на стороне просмотра / контроллера.Могу ли я свободно смешивать теги пружинной формы, такие как <form:input>, с обычными тегами, такими как <input type=file ...>?

Я видел хороший многокомпонентный раздел загрузки в документации MVC, но все еще нужно немногопомогите применить это к моему конкретному случаю.

Ответы [ 5 ]

7 голосов
/ 15 февраля 2010

Обновление: я думаю, что мой вопрос был плохо сформулирован.Я хотел создать пружину

. Я нашел очень хорошее объяснение того, как это сделать, в старой документации Spring и применил ее к новому Spring 3.0 MVC.В основном это означает, что вам нужно зарегистрировать PropertyEditor в вашем методе контроллеров @InitBinder.После этого все будет работать должным образом (при условии, что вы добавили MultiPartResolver в контекст и задали правильную кодировку формы).Вот мой образец:

@RequestMapping("/scriptfile/**")
@Controller
public class ScriptFileController {

    //we need a special property-editor that knows how to bind the data
    //from the request to a byte[]
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
    }

    @RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
    public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
        if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
        if (result.hasErrors()) {        
            modelMap.addAttribute("scriptFile", scriptFile);            
            modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
            return "scriptfile/create";            
        }        
        scriptFile.persist();        
        return "redirect:/scriptfile/" + scriptFile.getId();        
    }    
}
4 голосов
/ 18 февраля 2010

См. https://jira.springsource.org/browse/ROO-442 для связанной проблемы Roo.

3 голосов
/ 03 февраля 2010

Я не верю, что вы можете смешивать и сопоставлять загрузки файлов с обычными формами (по крайней мере, в Spring MVC), потому что формы загрузки файлов используют кодировку multipart/form-data, а не обычную application/x-www-form-urlencoded.

Когда вы указываете multipart/form-data, тогда в Spring вам нужно использовать реализацию MultipartResolver (как упомянуто в документах Spring, на которые вы ссылались), и все параметры декодирования должны проходить через это. Spring MVC не сможет декодировать входные данные обычной формы, так как все поля будут закодированы вместе с загруженным файлом.

Почти наверняка проще использовать две отдельные формы, одну для обычных вещей, одну для загрузки файла.

1 голос
/ 17 февраля 2010

Если вы используете Spring 3.0, вы можете создать конвертер и форматер (необязательно). Вам не нужно будет использовать метод initBinder и сохранять больше POJO, но ваше решение все еще очень корректно и все еще достаточно чисто. .

0 голосов
/ 19 марта 2018

Вам нужно иметь две формы, одну для загрузки файла и другую для загрузки данных. Я думаю об этом, потому что файл является большим архивом или небольшим, и потому что в этой ситуации это не сработает легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...