禁用弹簧引导多部件通过控制器上传



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

我知道弹簧启动具有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的答案

相关内容

  • 没有找到相关文章

最新更新