Подтвердить что ты не робот

Spring Загрузка нескольких файлов MVC с помощью функции множественной файловой формы HTML5

Я пытаюсь загрузить несколько файлов с помощью spring 3.1.2 с помощью @Controller и @RequestMapping.

Здесь я сделал и свою конфигурацию.

Форма Html5:

<form action="addFileSystemImage.foo" method="post" enctype="multipart/form-data">

    <input class='fileInput' type="file" name="files[]" multiple="multiple" />

    <input type="text" value="13asdf12eadsf" name="locId"/>

    <input type="submit" />

</form>

Метод контроллера:

@RequestMapping(value="/publisher/addFileSystemImage.foo", method=RequestMethod.POST)
public @ResponseBody List<UploadedFile> addFileSystemImage(@RequestParam("files[]") ArrayList<MultipartFile> files, String locId, HttpServletRequest request) {

 //do lotsa voodoo rocket science here to process the files  

}

my conf:

 <mvc:annotation-driven />
 <context:component-scan base-package="foo.package"></context:component-scan>
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

Отправка формы происходит с помощью метода addFileSystemImage. Данные для locId аргумента здесь, но аргумент "files" не связан. Это систематически null, независимо от того, какую комбинацию аргументов/полей/типов аргументов я пробовал.

Аргумент HttpServletRequest представляет собой org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest и содержит атрибут multiPartFile, который фактически хранит данные файла. Глядя на его значение в debug, я получаю

{files[]=[[email protected]6afd7f9, [email protected]28c2811, [email protected]f9aaed7]}

что означает, что мои файлы [] действительно здесь... но каким-то образом он не прошел шаг привязки данных правильно...

Теперь... Я знаю, что вы скажете мне, что я могу получить данные из запроса... но я предпочел бы, чтобы это работало правильно... Sring way...:) и у меня есть ArrayList из MultipartFile правильно заполнен.

Я что-то упустил? Кто-нибудь действительно сделал эту работу должным образом? Что я могу сделать, чтобы заполнить этот ArrayList (или даже обычный массив)?

Я прошел через это решение Spring MVC с загрузкой файла ajax и MultipartFile, который делает почти то же самое, что и я, но, очевидно, я должен делать что-то неправильно, потому что это решение не работает для меня.

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

Любая помощь оценивается.

Спасибо заранее.

4b9b3361

Ответ 1

Хотя вы уже получили свой ответ благодаря Алексу, я просто хотел бы немного рассказать. При привязке Spring поля формы привязаны к своим атрибутам "name" в HTML. Так как невозможно иметь поле формы с именем files [] (если объявить имя переменной с этим синтаксисом, его имя - это файлы, но это массив типа объявления), Spring не может совпадать с ним - и поведение в этом случае состоит в том, чтобы игнорировать данные в запросе.

Используя такой тип, как MultipartFile, вы можете использовать либо Список с именем "файлы", либо массив как следующие примеры:

private List<MultipartFile> files;
private MultipartFile[] files;

С соответствующими геттерами и сеттерами вы можете соответственно получить доступ и изменить список файлов.

Ответ 2

Включили ли в себя зависимость от общедоступных файлов?

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3</version>
</dependency>

Я тестировал файловую загрузку, отлично работает даже с ArrayList как тип параметра в обработчике контроллера