禁用控制器的春季启动分段上传

时间:2016-06-30 21:14:22

标签: spring file file-upload spring-boot multipart

我使用spring boot来上传文件。文件大小通常约为2GB,我们无法使用默认的spring boot StandardServletMultipartResolverCommonsMultipartResolver,因为服务器具有有限的资源(磁盘空间)或用于缓冲的内存。因此,我们希望获取文件输入,并将文件直接存储到云存储中。

我知道spring boot具有multipart.enabled属性,因此我可以将其设置为false以跳过spring MultipartResolver。但这会全局禁用multipart。有没有人知道是否有办法通过控制器/方法禁用multipart?

4 个答案:

答案 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)

这说明了如何做到这一点:

springboot-large-streaming-file-upload-using-apache-commons-fileupload

查看balajeerc

的答案

答案 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();

    ...
  }