Я создаю 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
пуст?
Спасибо за помощь.