Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将Apache Commons FileUpload与Spring Boot multipart.resolve-Lazy一起使用_Java_Spring_Spring Boot_Streaming_Apache Commons Fileupload - Fatal编程技术网

Java 无法将Apache Commons FileUpload与Spring Boot multipart.resolve-Lazy一起使用

Java 无法将Apache Commons FileUpload与Spring Boot multipart.resolve-Lazy一起使用,java,spring,spring-boot,streaming,apache-commons-fileupload,Java,Spring,Spring Boot,Streaming,Apache Commons Fileupload,我正在使用Spring引导框架构建RESTAPI。有一个端点,用户可以上传一个大文件(~1GB)。我使用的是ApacheCommonsFileUpload 我只想在该端点启用流式处理。因此,我将Spring引导配置如下: spring.servlet.multipart.enabled = true spring.servlet.multipart.resolve-lazily = true spring.servlet.multipart.max-file-size = 2GB spring.

我正在使用Spring引导框架构建RESTAPI。有一个端点,用户可以上传一个大文件(~1GB)。我使用的是ApacheCommonsFileUpload

我只想在该端点启用流式处理。因此,我将Spring引导配置如下:

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.");
}
@PostMapping(path=“/import”,consumes=MediaType.MULTIPART\u FORM\u DATA\u VALUE)
公共响应EntityImportData(HttpServletRequest请求)引发IOException、FileUploadException{
System.out.println(“流媒体…”);
布尔值isMultipart=ServletFileUpload.isMultipartContent(请求);
如果(!isMultipart){
返回ResponseEntity.badRequest().build();
}
ServletFileUpload upload=新建ServletFileUpload();
FileItemIterator iterStream=upload.getItemIterator(请求);
while(iterStream.hasNext()){
System.out.println(“迭代…”);
FileItemStream item=iterStream.next();
如果(!item.isFormField()){
字符串名称=item.getFieldName();
System.out.println(“字段名为:“+name”);
try(InputStream uploadedStream=item.openStream();
OutputStream out=新文件OutputStream(“file.zip”)){
IOUtils.copy(上传流,输出);
}
}否则{
尝试(InputStream=item.openStream()){
字符串formFieldName=item.getFieldName();
String formFieldValue=Streams.asString(stream);
System.out.println(String.format(“找到的表单字段-%s:%s”、formFieldName、formFieldValue));
}
}
}
返回ResponseEntity.ok(“数据流传输成功”);
}
调用该方法并执行代码。但是,
FileItemIterator
是空的,当不执行
循环时,
中有一个值

如果我将
spring.servlet.multipart.enabled=false设置为
。但我不想这样做,因为正如我所说的,我不想全局禁用SpringBoot多部分解析器,但只在这个端点禁用

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

谢谢你的帮助。

我解决了我的问题

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

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

嗨,谢谢你的回答。不幸的是,这并不能解决我的问题。iterStream.hasNext()从一开始就返回false。我正在使用一些拦截器和Spring Security,它们可能会在请求到达我的控制器之前弄乱请求。在您的情况下,您是否也使用了Spring安全性和LocaleChangeInterceptor?提前谢谢。您好,我有Spring Security,但没有拦截器。好的,我可以通过禁用拦截器来确认,hasNext()已开始返回true。感谢您的反馈。若要禁用特定URL的侦听器,请执行以下操作:@Override public void addInterceptors(最终侦听器注册表){registry.addInterceptor(localechangereceptor()).addPathPatterns(“/**”).ExcludePathPathPatterns(“/the/endpoint/you/use/for/upload”);}