Невозможно использовать Apache Commons FileUpload с Spring Boot multipart.resolve-lazily - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю REST API с использованием среды Spring Boot.Существует одна конечная точка, где пользователи смогут загружать большие файлы (~ 1 ГБ).Я использую Streaming API из Apache Commons FileUpload.

Я хочу включить потоковую передачу только в этой конечной точке.Поэтому я настраиваю свой Spring Boot следующим образом:

spring.servlet.multipart.enabled = true
spring.servlet.multipart.resolve-lazily = true
spring.servlet.multipart.max-file-size = 2GB
spring.servlet.multipart.max-request-size = 2GB

И вот моя конечная точка:

@PostMapping(path = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> importData(HttpServletRequest request) throws IOException, FileUploadException {
    System.out.println("Streaming...");

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    if (!isMultipart) {
        return ResponseEntity.badRequest().build();
    }

    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iterStream = upload.getItemIterator(request);
    while (iterStream.hasNext()) {
        System.out.println("Iterating...");

        FileItemStream item = iterStream.next();

        if (!item.isFormField()) {

            String name = item.getFieldName();
            System.out.println("Field name is: " + name);

            try (InputStream uploadedStream = item.openStream();
                 OutputStream out = new FileOutputStream("file.zip")) {

                IOUtils.copy(uploadedStream, out);
            }

        } else {

            try (InputStream stream = item.openStream()) {
                String formFieldName = item.getFieldName();
                String formFieldValue = Streams.asString(stream);
                System.out.println(String.format("Form field found - %s: %s", formFieldName, formFieldValue));
            }
        }
    }

    return ResponseEntity.ok("Data streamed successfully.");
}

Метод вызывается и код выполняется.Тем не менее, FileItemIterator пусто, там цикл while не выполняется.

Этот код отлично работает, если я установил spring.servlet.multipart.enabled = false.Но я не хочу этого делать, потому что, как я уже сказал, я не хочу отключать Spring Boot Multipart Resolver глобально, но только на этой конечной точке.

Итак, что не так с моим кодом?Почему FileItemIterator пуст?

Спасибо за помощь.

1 Ответ

0 голосов
/ 01 марта 2019

Я решил свою проблему.

Я думаю, что проблема в весне StandardServletMultipartResolver.Когда я переключаюсь на CommonsMultipartResolver (как настроено ниже), мой код работает отлично.

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setDefaultEncoding("UTF-8");
    resolver.setResolveLazily(true);
    return resolver;
}
...