Spring загрузка файла в смешанной форме

Я хочу загрузить файл в свой spring 3.0 applicationatoin (созданный с помощью 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;
}

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

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

Ответ 1

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

Я нашел очень хорошее объяснение, как это сделать в старой документации 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();        
    }    
}

Ответ 3

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

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

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

Ответ 4

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