当前位置: 首页 > 知识库问答 >
问题:

通过控制器禁用spring boot多部分上传

张德佑
2023-03-14

我使用Spring引导上传文件。文件大小通常约为2GB,我们不能使用默认的Spring引导Standard ServletMultipartResolverCommon sMultipartResolver,因为服务器具有有限的资源(磁盘空间)或用于缓冲的内存。所以我们想获取文件输入蒸汽并将文件直接存储到云存储中。

我知道spring boot有<code>多部分。已启用属性,因此我可以将其设置为false以跳过spring多部件解析器。但这会全局禁用多部分。是否有人知道是否有方法通过控制器/方法禁用多部分?

共有3个答案

白嘉志
2023-03-14

这个线程还很旧,但这是一个工作解决方案(Spring Boot 2):

应用属性:

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

    ...
  }
袁雅逸
2023-03-14

实际上,可以使用自定义的MultipartResolver有条件地禁用multipary,但是您应该在请求级别这样做。

启用多部分后,文件将本地存储在服务器上,关闭多部分后,您的控制器必须手动执行解析

由于我在这个话题上读到了如此多相互矛盾的信息,所以我决定在这里深入探讨细节,https://youtu.be/OpJ0jKRBa1g,在这里我将说明如何让这两种策略同时并存。

巫马昆杰
2023-03-14

如果启用<code>惰性解析</code>,结果正是我认为您想要的结果。

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)
 类似资料:
  • 您好,我目前正在尝试构建一个Spring Boot后端以与SyncFusion的Datamanager匹配(据我所知,他们为后端构建留档纯粹是为了. NET。)我已经设法让GET功能正常工作,因此我的数据类型映射是正确的,但发布会导致一些问题。具体来说,DataManager似乎发布了一个multipart/混合,其中包括我试图持久化的JSON对象以及某种批处理文件(我不关心)。由于我无法修改da

  • 我正在尝试测试此控制器: 使用此模拟请求: 虽然,我猜我写MockMvcRequest错误,因为测试失败(返回的状态是500)。 提前感谢。

  • 我试图创建一个页面,用户可以张贴图像及其细节。现在,当我测试来自postman的spring boot服务时,我能够成功地在服务中获取文件。当我试图从angular5中做同样的事情时,多部分文件在服务中没有被识别,并且总是得到空数组。 我的角服务代码如下 } 我已经尝试添加标头,如multipart/form-data,并将其设置为un定义。无论哪种方式,我都收到了错误。在发布到这里之前,我已经广

  • 这是我当前通过CloudFront成功上传文件到S3的代码: 现在对于分块上传(或者AWS术语中的多部分),我不知道如何通过CloudFront(只有S3的文档)来完成它。 它发送了一个预飞行请求(OPTIONS),并返回,其中包含以下响应头: 但实际的POST请求返回并带有以下响应头:

  • 我正在尝试使用aws-java-sdk(1.11.230)编写一个实用程序。我可以使用PutObjectRequest编写SSE-KMS文件,如下所示: 但是在尝试以多部分方式上传它时,我找不到任何方法来指定SSE-KMS的加密配置。 任何人都可以建议一种方法来成功完成这一任务吗。如有任何建议,我们将不胜感激。 维卡什·帕里克

  • 尝试测试上载文件时,获取此“文件”不存在错误,但控制器在测试之外工作良好。文件不在这里有什么原因吗? 控制器 控制器测试