Spring Boot - 上传包含对象和大量文本(5000 个字符或更多)的文件?

问题描述 投票:0回答:1

目标是允许用户填写表单:

  • 基本信息(小文本字段)
  • 一个文本区域(大量文本,想想一个文本寻呼机)
  • 并上传文件

令人惊讶的是,我从未构建过任何这样的 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。但我认为这不是最佳实践。

java spring-boot file-upload textarea
1个回答
0
投票

据我了解,您也正在尝试处理多部分文件。您尝试过使用@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 {}
© www.soinside.com 2019 - 2024. All rights reserved.