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();
}
}
Ответ 2
См. https://jira.springsource.org/browse/ROO-442 для связанной проблемы Roo.
Ответ 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, но ваше решение по-прежнему очень актуально и по-прежнему довольно чистый.