Как получить все отправленные MultipartFiles, независимо от их имени - PullRequest
0 голосов
/ 19 февраля 2020

Я бы хотел, чтобы пользователь мог отправлять любое количество файлов с произвольным именем и именем_файла_файла.

Как получить список отправленных файлов в запросе?

@RequestParam(name = "*") MultipartFile[] files

Я надеялся, что использование регулярного выражения или аналогичного по имени параметра будет работать, но все мои тесты не пройдены.

Эквивалент Flask будет

request.files

Есть идеи?

1 Ответ

1 голос
/ 19 февраля 2020

Смежный вопрос: Получение файлов в контроллере без имени @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 [ОБНОВЛЕНИЕ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...