我使用spring boot上传文件。文件大小通常约为2GB,我们不能使用默认的spring引导StandardServletMultipartResolver
或CommonsMultipartResolver
,因为服务器的资源(磁盘空间)或内存有限,无法进行缓冲。因此,我们希望获取文件输入并将文件直接存储到云存储中。
我知道弹簧启动具有multipart.enabled
属性,因此我可以将其设置为false以跳过弹簧MultipartResolver
。但这会在全局禁用multipart。有没有人知道是否有一种方法来禁用多部分的控制器/方法?
如果你启用resolve-lazily
,结果正是我认为你想要的。
spring.servlet.multipart.enabled = true
spring.servlet.multipart.resolve-lazily = true
现在你可以用任意一种形式的签名来编写控制器。
内置多部分解析器的预解析…
@PostMapping("/upload1")
public ResponseEntity<Void> postUpload1(
@RequestParam("metadata") MultipartFile metadata,
@RequestParam("payload") MultipartFile payload)
或后解析(您可以自己解析)…
@PostMapping(path = "/upload2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> postUpload2(HttpServletRequest rawRequest)
实际上可以使用自定义MultipartResolver有条件地禁用多方,但您应该在请求级别执行。
启用multipart后,文件本地存储在服务器上,关闭multipart后,控制器必须手动执行解析。
因为我读了这么多关于这个话题的相互矛盾的信息,我决定在这里进入细节https://youtu.be/OpJ0jKRBa1g,我说明如何在同一时间有两种策略共存。
这个线程很老了,但这里有一个工作解决方案(Spring Boot 2):
application.properties:
spring.servlet.multipart.enabled=false
配置:@Bean
public MultipartResolver customMultipartResolver() {
final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setResolveLazily(true);
return multipartResolver;
}
控制器(手动处理):
@PostMapping(consumes = { "multipart/form-data" })
public ResponseEntity<> manualHandling(
HttpServletRequest request) throws FileUploadException, IOException {
final FileItemIterator iterStream = new ServletFileUpload().getItemIterator(request);
...
}
控制器(标准多部件):
@PostMapping(value = "file", consumes = { "multipart/form-data" })
public ResponseEntity<> multipartHandling(MultipartHttpServletRequest request) throws IOException {
final Map<String, MultipartFile> files = request.getMultiFileMap().toSingleValueMap();
Iterator<MultipartFile> iter =files.values().iterator();
...
}
如下所示:
springboot-large-streaming-file-upload-using-apache-commons-fileupload
看balajeerc的答案