You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

REST中如何批量上传文件并关联批量JSON数据?

问题

我目前通过以下方式批量提交车辆数据:

{
  "cars": [
    {"brand":"opel","plateNum":"1234"},
    {"brand":"bmw","plateNum":"2345"},
    {"brand":"audi","plateNum":"3456"}
  ]
}

现在需要新增功能,为每辆车上传多份文件(如用户手册、登记证书等)。如果不采用批量上传,我可以使用multipart/form-data格式,将JSON与文件一同提交,能明确文件归属:

car: {"brand":"opel","plateNum":"1234"}
usermanual: file.jpg
..etc

请问如何实现批量上传?我想到的方案是为车辆添加唯一ID并作为文件名后缀,但希望避免这种方式。

能否在multipart/form-data中按ID对上传文件进行分组,例如:

cars: [
{"id":1,"brand":"opel","plateNum":"1234"},
{"id":2,"brand":"bmw","plateNum":"2345"},
{"id":3,"brand":"audi","plateNum":"3456"}
]
filegroup1:
  usermanual:file.jpg
  ..etc
filegroup2:
  usermanual:file.jpg
  ..etc
filegroup3:
  usermanual:file.jpg
  ..etc

REST是否支持此类实现?或者批量JSON关联文件上传的通用实践是什么?


解决方案

1. 利用multipart/form-data字段命名规则分组(最通用)

不需要嵌套分组,直接通过字段名前缀绑定车辆ID即可,所有后端框架都能兼容:

  • 先提交带唯一ID的批量车辆JSON数据作为cars字段
  • 每个车辆的文件字段命名为{carId}_{fileType},比如1_usermanual、2_registration

示例请求结构:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="cars"

[{"id":1,"brand":"opel","plateNum":"1234"},{"id":2,"brand":"bmw","plateNum":"2345"},{"id":3,"brand":"audi","plateNum":"3456"}]
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="1_usermanual"; filename="opel_manual.jpg"
Content-Type: image/jpeg

(文件二进制内容)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="2_registration"; filename="bmw_reg.pdf"
Content-Type: application/pdf

(文件二进制内容)
----WebKitFormBoundary7MA4YWxkTrZu0gW--

解析时拆分字段名提取ID和文件类型,就能快速关联到对应车辆。

2. 嵌套multipart/form-data(语义更清晰,但兼容性有限)

HTTP标准允许multipart/form-data内部嵌套子multipart,可以把单辆车的信息和文件打包成一个独立分组:

  • 根层级设置多个car_group字段,每个car_group是一个子multipart,包含该车辆的car_info(JSON)和对应文件字段

示例结构:

Content-Type: multipart/form-data; boundary=outer_boundary

--outer_boundary
Content-Disposition: form-data; name="car_group"
Content-Type: multipart/form-data; boundary=inner_boundary

--inner_boundary
Content-Disposition: form-data; name="car_info"

{"brand":"opel","plateNum":"1234"}
--inner_boundary
Content-Disposition: form-data; name="usermanual"; filename="opel_manual.jpg"
Content-Type: image/jpeg

(文件二进制)
--inner_boundary--
--outer_boundary
Content-Disposition: form-data; name="car_group"
Content-Type: multipart/form-data; boundary=inner_boundary_2

--inner_boundary_2
Content-Disposition: form-data; name="car_info"

{"brand":"bmw","plateNum":"2345"}
--inner_boundary_2
Content-Disposition: form-data; name="registration"; filename="bmw_reg.pdf"
Content-Type: application/pdf

(文件二进制)
--inner_boundary_2--
--outer_boundary--

这种方式语义更直观,但部分后端框架需要额外配置才能解析嵌套结构(比如Spring Boot、Node.js的multer)。

3. 分两步提交(低耦合方案)

如果不想在单个请求里处理复杂关联,可以拆分为两步:

  1. 先批量提交车辆JSON数据,后端返回每个车辆的唯一标识(如数据库ID)
  2. 再批量上传文件,通过字段名或请求路径参数(如POST /cars/{carId}/files)关联对应车辆

这种方式逻辑简单,便于排查问题,适合文件数量多或体积大的场景。

REST规范说明

REST没有严格限制请求格式,只要能清晰表达资源关联即可。上述第一种字段前缀分组的方式是行业通用实践,兼容性最强;你设想的filegroupN分组可以通过嵌套multipart实现,但通用性不如前者。

内容的提问来源于stack exchange,提问作者beatrice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:03:11