【问题标题】:Spring Boot doesn't recognize multipart form-data element when filename is missing缺少文件名时,Spring Boot 无法识别多部分表单数据元素
【发布时间】:2022-02-04 23:09:08
【问题描述】:

我有这个代码:

@PostMapping("foobar")
public ResponseEntity<SaveLogsResult> foobar(@RequestPart("file") MultipartFile log, @RequestPart("env") MultipartFile json){
    return ResponseEntity.ok(fooService.saveFooBar(log, json, UUID.randomUUID().toString()));
}

两个应用程序向此端点发送正式正确的数据,一个严重失败并收到 http 状态 400。

我设置了logging.level.org.springframework.web=DEBUG 并且可以看到(除其他外):

Required request part 'env' is not present
Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'env' is not present]
Completed 400 BAD_REQUEST

为了进一步诊断这个问题,我比较了一个工作(左)和一个非工作(右)请求。唯一不同的是失踪的filename

据我了解,RFC for Content-Disposition 省略 filename 是完全有效的:

后跟一个包含文件原始名称的字符串 传送。 文件名始终是可选的,不得使用 应用程序盲目:路径信息应该被剥离,并且 应完成向服务器文件系统规则的转换。这个 参数主要提供指示性信息。当用于 与 Content-Disposition: attachment 结合,用作 最终呈现给“另存为”对话框的默认文件名 用户。

这是 Spring 内部的错误吗?我使用 Spring Boot 2.6.2 不幸的是,我无法更改非工作组件以进行快速测试,因为它是购买的组件,不会经常收到错误修复。 我认为我的问题与here 描述的问题不同,因为故障只发生在特定场景中。

【问题讨论】:

    标签: spring spring-boot http http-headers


    【解决方案1】:

    看来您必须提供文件名。看到这个issue

    这种 [文件名不存在的情况] 可能会导致不一致,例如你会得到它 MultipartFile 但不包含 MultipartFile 的集合或数组,并且 人们可以提出相反的论点,认为它应该被拒绝。

    如果没有,为什么将它作为 MultipartFile 注入很重要 甚至有一个文件名?您也可以将其作为 InputStream 或任何 已注册的 HttpMessageConverter 支持的其他类型。

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 2023-03-08
      • 2020-10-12
      • 2021-09-07
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多