我使用spring boot来上传文件。文件大小通常约为2GB,我们无法使用默认的spring boot StandardServletMultipartResolver
或CommonsMultipartResolver
,因为服务器具有有限的资源(磁盘空间)或用于缓冲的内存。因此,我们希望获取文件输入,并将文件直接存储到云存储中。
我知道spring boot具有multipart.enabled
属性,因此我可以将其设置为false以跳过spring MultipartResolver
。但这会全局禁用multipart。有没有人知道是否有办法通过控制器/方法禁用multipart?
答案 0 :(得分:4)
如果启用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)
答案 1 :(得分:0)
答案 2 :(得分:0)
实际上可以使用自定义的MultipartResolver有条件地禁用multipary,但是您应该在请求级别执行此操作。
启用多部分功能后,文件将本地存储在服务器上,并且禁用多部分功能后,控制器必须手动进行解析。
由于我在该主题上阅读了太多相互矛盾的信息,因此我决定在https://youtu.be/OpJ0jKRBa1g处进行详细说明,以说明如何使两种策略同时共存。
答案 3 :(得分:0)
这个线程已经很老了,但这里有一个可行的解决方案(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();
...
}