无法通过Spring Boot multipart.resolve-lazily使用Apache Commons FileUpload [英] Cannot use Apache Commons FileUpload with Spring Boot multipart.resolve-lazily

查看:749
本文介绍了无法通过Spring Boot multipart.resolve-lazily使用Apache Commons FileUpload的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm building a REST API using Spring Boot framework. There is one endpoint where users will be able to upload a large file (~1GB). I'm using Streaming API from Apache Commons FileUpload.

我只想仅在该端点上启用流.因此,我将Spring Boot配置如下:

I only want to enable streaming only at that endpoint. Therefore, I configure my Spring Boot as follow:

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循环.

The method is called and the code is executed. However, the FileItemIterator is empty, there for the while loop is not executed.

如果我设置spring.servlet.multipart.enabled = false,则此代码将完美工作.但是我不想这样做,因为正如我所说,我不想全局禁用Spring Boot Multipart Resolver,而只能在此端点上禁用.

This code works perfectly if I set spring.servlet.multipart.enabled = false. But I don't want to do that because as I said, I don't want to disable Spring Boot Multipart Resolver globally, but only at this endpoint.

那么,我的代码有什么问题?为什么FileItemIterator为空?

So, what is wrong with my code? Why is the FileItemIterator is empty?

谢谢您的帮助.

推荐答案

我解决了我的问题.

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

I think the problem is at Spring StandardServletMultipartResolver. When I switch to CommonsMultipartResolver (as configured below), my code works perfectly.

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

这篇关于无法通过Spring Boot multipart.resolve-lazily使用Apache Commons FileUpload的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆