繁体   English   中英

无法通过Spring Boot multipart.resolve-lazily使用Apache Commons FileUpload

[英]Cannot use Apache Commons FileUpload with Spring Boot multipart.resolve-lazily

我正在使用Spring Boot框架构建REST API。 用户可以在一个端点上载一个大文件(约1GB)。 我正在使用来自Apache Commons FileUpload的Streaming API

我只想在该端点上启用流。 因此,我将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为空?

谢谢您的帮助。

我解决了我的问题。

我认为问题出在Spring StandardServletMultipartResolver 当我切换到CommonsMultipartResolver (如下配置)时,我的代码可以正常工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM