Java 无法将Apache Commons FileUpload与Spring Boot multipart.resolve-Lazy一起使用
我正在使用Spring引导框架构建RESTAPI。有一个端点,用户可以上传一个大文件(~1GB)。我使用的是ApacheCommonsFileUpload 我只想在该端点启用流式处理。因此,我将Spring引导配置如下: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.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
是空的
谢谢你的帮助。我解决了我的问题
我认为问题出在SpringStandardServletMultipartResolver
。当我切换到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”);}