Смежный вопрос: Получение файлов в контроллере без имени @RequestParam
Вы можете получить запрошенные составные файлы, используя MultipartRequest#getFileMap
, например:
MultipartRequest multipartRequest = .....
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
MultipartFile[] files = fileMap.values().toArray(new MultipartFile[0]);
...
Также вы можете получить все файлы, используя MultipartRequest#getMultiFileMap
, даже если для нескольких файлов назначено одно и то же имя параметра, например:
<input type="file" name="file1"/>file1
<input type="file" name="file2"/>file2
<input type="file" name="file2"/>file2X
Spring's DispatcherServlet
/ MultipartFilter
оболочка HttpServletRequest
объект в MultipartHttpServletRequest
(расширение MultipartRequest
) объекта при отправке multipart/form-data
с запросом, а MultipartRequest
может быть аргументом метода контроллера.
Таким образом, метод вашего контроллера будет примерно таким:
@RequestMapping("upload")
public String upload(MultipartRequest multipartRequest) {
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
MultipartFile[] files = fileMap.values().toArray(new MultipartFile[0]);
// Use when the same parameter name is assigned to multiple files.
// MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
// MultipartFile[] files = multiFileMap.values().stream().flatMap(values -> values.stream()).toArray(MultipartFile[]::new);
for (MultipartFile multipartFile : files) {
System.out.println("param name: " + multipartFile.getName());
System.out.println("filename: " + multipartFile.getOriginalFilename());
System.out.println("size: " + multipartFile.getSize());
}
return ".....";
}
Когда вы отправляете «1.jpg» (имя параметра «file1») и «2.jpg» (имя параметра «file2» '), вы получите такой вывод:
param name: file1
filename: 1.jpg
size: 155152
param name: file2
filename: 2.jpg
size: 154015
[ОБНОВЛЕНИЕ]
Я нашел более простое решение. Map<String, MultipartFile>
/ MultiValueMap<String, MultipartFile>
также может быть аргументом метода контроллера с аннотацией @RequestParam
, атрибут name которого пуст. Поэтому вы можете упростить метод контроллера следующим образом:
@RequestMapping("upload")
public String upload(@RequestParam Map<String, MultipartFile> fileMap) {
MultipartFile[] files = fileMap.values().toArray(new MultipartFile[0]);
.......
return ......
}
или
@RequestMapping("upload")
public String upload(@RequestParam MultiValueMap<String, MultipartFile> multiFileMap) {
MultipartFile[] files = multiFileMap.values().stream().flatMap(values -> values.stream())
.toArray(MultipartFile[]::new);
.......
return ......
}
См. Также
Javado c ДиспетчерСервлет # checkMultipart
Javado c MultipartFilter
Javado c MultipartResolver # resolMultipart
Javado c из MultipartHttpServletRequest
Javado c из RequestParamMapMethodArgumentResolver [ОБНОВЛЕНИЕ]