目标是允许用户填写表单:
令人惊讶的是,我从未构建过任何这样的 API。它始终是带有一些较小字段的文件,仅 json,或仅文件。
例如,这按预期工作:
@PutMapping(value = "/submit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<FormData> submit(
@RequestParam(required = false) String firstName,
@RequestParam(required = false) String lastName,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate submitDate,
@RequestParam(required = false) MultipartFile file) throws IOException {
对于文本区域,我将更改为:
@PutMapping(value = "/submit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<FormData> submit(
@RequestParam(required = false) String firstName,
@RequestParam(required = false) String lastName,
@RequestParam(required = false) String explanation, // possibly 5-10k characters
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate submitDate,
@RequestParam(required = false) MultipartFile file) throws IOException {
结果是报头太大错误。 然后我切换到@RequestBody:
@PutMapping(value = "/submit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<FormData> submit(
@RequestBody Submission submission) throws IOException {
提交内容将具有与“解释”相同的字段。我会收到“媒体不支持”错误。
到目前为止,我还没有找到任何像我的用例一样的例子。任何指导表示赞赏。
我有替代解决方案,将解释文本区域内容“转换”到一个文件中,然后我最终会得到一个接受一些小文本字段和两个文件的 API。但我认为这不是最佳实践。
据我了解,您也正在尝试处理多部分文件。您尝试过使用@RequestPart吗?它允许您将多部分文件与 JSON 对象分开,并将其作为单独的参数进行处理。
我认为,Spring 本身不支持同时处理多部分文件和 JSON 有效负载,因为 @RequestBody 旨在处理请求正文中的单个序列化 JSON 对象。
@PutMapping(value = "/submit", consumes = "multipart/form-data")
public ResponseEntity<FormData> submit(
@RequestPart Submission submission, @RequestPart MultipartFile file) throws IOException {}