【问题标题】:How to get a hierarchical Multipart request data in REST controller?如何在 REST 控制器中获取分层多部分请求数据?
【发布时间】:2021-09-22 13:22:22
【问题描述】:

有一个 spring-mvc 控制器资源来接收文件并将它们存储在本地存储中。该请求是一个多部分(“Content-Type:multipart/form-data”),由几个部分组成。第一部分是文件的 JSON/XML 描述。第二个和以下是文件。但这些部分也可能是多部分的(“Content-Type: multipart/mixed”)。一小部分文件。多部分中的多部分。

POST /exampleAPI/nms/v1/myStore/tel%3A%2B19585550100/objects/operations/bulkCreation HTTP/1.1
Accept: application/xml
Authorization: BEARER 08776724-6d0d-4aa6-a404-2bc19b5cf903
Host: example.com
Content-Type: multipart/form-data; boundary="===============outer123456==";
Content-Length: nnnn
MIME-Version: 1.0
--===============outer123456==
Content-Type: application/xml
Content-Disposition: form-data; name=”root-fields”
<?xml version="1.0" encoding="UTF-8"?>
<nms:objectList xmlns:nms="urn:oma:xml:rest:netapi:nms:1">
<object>
 <parentFolder>http://example.com/exampleAPI/nms/v1/myStore/tel%3A%2B19585550100/folders/fld123</parentFolder>
<attributes/>
 <flags>
 <flag>\Seen</flag>
 <flag>\Flagged</flag>
 </flags>
</object>
<object>
 <parentFolderPath>/Pictures</parentFolderPath>
 <attributes/>
 <flags>
 <flag>\Seen</flag>
 </flags>
</object>
</nms:objectList>
--===============outer123456==
Content-Type: multipart/mixed; boundary=”--=-sep-=--”
Content-Disposition: form-data; name=”attachments”
----=-sep-=--
Content-Type: text/plain
Content-Disposition: attachment; filename=”body.txt”
See attached photo
----=-sep-=--
Content-Type: image/gif
Content-Disposition: attachment; filename="picture.gif"
GIF89a...binary image data...
----=-sep-=----
--===============outer123456==
Content-Type: multipart/mixed; boundary=”--=-sep-=--”
Content-Disposition: form-data; name=”attachments”
----=-sep-=--
Content-Type: text/plain
Content-Disposition: attachment; filename=”body.txt”
Photo from trip to Vancouver
----=-sep-=--
Content-Type: image/gif
Content-Disposition: attachment; filename="picture.gif"
GIF89a...binary image data...
----=-sep-=----
--===============outer123456==--

我必须根据请求结构将它们分组存储。 Body.txt 和picture.gif 来自一组中的第二个表单数据部分,来自另一组中的第三个表单数据的文件。但是使用 MultipartFile 或 Part 或 MultipartHttpServletRequest 没有关于嵌套的信息,所有文件都在一个级别上。

如何在层次结构中接收多部分数据?

@RestController
public class AttachmentController {

@PostMapping(path = ("/upload"), consumes = {"multipart/form-data", "multipart/mixed"})
public Response uploadFiles(
        @RequestPart(value = "description") FilesDescription fileDesc,
        @RequestPart(value = "attachments", required = false) List<MultipartFile> attachments) {

【问题讨论】:

    标签: java spring-mvc multipart


    【解决方案1】:

    此行为是指已被 RFC 7578 废弃的 RFC 2388。

    RFC 7578 4.3

    [RFC2388] 建议单个表单域的多个文件 使用嵌套的“多部分/混合”部分传输。这种用法是 已弃用。

    为了匹配广泛部署的实现,必须发送多个文件 通过在单独的部分中提供每个文件但都具有相同的 “名称”参数。

    接收旨在广泛适用的应用程序(例如, multipart/form-data 解析库)也应该支持旧的 提供多个文件的方法。

    大多数现代库都实现了 RFC 7578 行为。由于同名“name=attachments”,多部分/混合内容的所有部分都将放在同一个数组中。

    基于此,在 multipart/form-data 下分层解析嵌套的 multipart/mixed 的要求可能被认为已过时。

    【讨论】:

      猜你喜欢
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多