2015-08-11 4 views
7

Я пытаюсь загрузить многоуровневые файлы с помощью FormData и spring.Загрузите несколько файлов с помощью ajax и spring mvc

HTML:

<input type="file" name="img" multiple id="upload-files"> 

JS код:

var ajaxData = new FormData(); 
var files = $('#upload-files').prop('files'); 
for(var i=0;i<files.length;i++){ 
    ajaxData.append('file['+i+']', files[i]); 
} 
ajaxData.append("file", files); 
$http.post('../rest/upload', ajaxData, { 
    headers: {'Content-Type': undefined }, 
    transformRequest: angular.identity 
}); 

Spring Controller Код:

@RequestMapping(value = "/upload", produces="application/json", method = RequestMethod.POST) 
@ResponseBody 
public String upload(
     @RequestParam ArrayList<MultipartFile> files 
){ 
    System.out.println(files.size()); 
    return null; 
} 

Однако, количество файлов выходит равным 0 на подаче запроса с несколько файлов. При использовании нотации массива MultipartFile[] files вместо ArrayList он дает 400, Bad Request.

Как заставить контроллер весны работать с несколькими файлами? Я не могу найти решение по другим вопросам SO.

+0

Вы пытались переместить List в объект и настроили CommonsMultipartResolver и InternalResourceViewResolver на spring-servlet.xml? –

+0

Вы правильно добавили encType в кнопку отправки формы? например

и тип ввода как

ответ

4

По умолчанию DataBinder пытается связать параметры запроса с целевым объектом с помощью соглашения - имена параметров из запроса (FormData в вашем случае) и действия контроллера должны совпадать.

В вашем случае следует переименовать file[i] в files[i]: параметр

for(var i=0; i < files.length; i++){ 
    ajaxData.append('files[' + i + ']', files[i]); 
} 

ИЛИ переименовани действия пользователя от ArrayList<MultipartFile> files к ArrayList<MultipartFile> file


Кроме того, удалить эту строку ajaxData.append("file", files); (который сразу же после for loop), потому что он устанавливает параметр с тем же именем и может произойти какой-то сбой.

Надеюсь, что это поможет.

Смежные вопросы