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

cURL经Google临时URL传GLB至Shopify时报400 Malformed multipart body错误

问题根因
  • 核心矛盾来自cURL请求头的错误覆盖:你手动指定的Content-Type:multipart/form-data字段,完全覆盖了cURL自动生成的带边界标识的合法请求头
  • 你之前观察到的两个长度值差(请求总Content-Length 1801555,文件实际大小1800252)属于完全正常的multipart协议开销,差值就是表单字段头部、分隔符、结束标识的固定长度,不属于异常问题
  • 服务端返回Malformed multipart body的直接原因是:收到的Content-Type头没有携带规定的boundary参数,无法识别多段表单内容的分割边界,直接判定请求体格式非法
  • 你看到1.7MB文件1秒就传输完成、同时触发400错误,本质是服务端在校验请求头阶段就发现格式非法,主动中断了剩余请求体的接收,并不是真的完整传输了全部文件内容
修复操作步骤
  1. 删除cURL命令中手动添加的-H "Content-Type:multipart/form-data"配置行,把multipart格式的头信息生成完全交给cURL自动处理
  2. 保留其余所有自定义请求头配置,这些字段是Google签名上传要求的固定参数,不会和cURL自动生成的内容冲突:
  • Accept:application/json
  • x-upload-content-type:application/octet-stream
  • X-Upload-Content-Length:{通过os.path.getsize获取的本地文件实际字节数}
  1. 保持现有-F形式的表单字段配置不变,cURL会自动完成所有表单内容的拼接、长度计算、头信息生成
  2. 修正后的cURL命令模板参考:
curl -v \
  -H "Accept:application/json" \
  -H "x-upload-content-type:application/octet-stream" \
  -H "X-Upload-Content-Length:1800252" \
  -F "GoogleAccessID=你的GoogleAccessID值" \
  -F "key=你的上传key值" \
  -F "policy=你的policy签名串" \
  -F "signature=你的signature值" \
  -F "file=@你的GLB文件本地绝对路径" \
  "Google提供的临时上传URL"
易踩坑提醒
  • 不要为-F的文件字段额外手动指定Content-Type,cURL默认传递的application/octet-stream完全符合GLB文件的上传要求
  • 拼接cURL命令时,所有插入的参数字符串如果包含特殊字符、空格,要保证引号包裹完整,避免命令截断导致的表单结构错乱
  • 等Google侧上传返回成功响应后,再调用Shopify的GraphQL接口关联媒体资源,此前出现的“部分媒体上传失败”提示就是因为Google侧上传环节本身就没成功,不是Shopify接口的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 12:54:04