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错误,本质是服务端在校验请求头阶段就发现格式非法,主动中断了剩余请求体的接收,并不是真的完整传输了全部文件内容
修复操作步骤
- 删除cURL命令中手动添加的
-H "Content-Type:multipart/form-data"配置行,把multipart格式的头信息生成完全交给cURL自动处理 - 保留其余所有自定义请求头配置,这些字段是Google签名上传要求的固定参数,不会和cURL自动生成的内容冲突:
Accept:application/jsonx-upload-content-type:application/octet-streamX-Upload-Content-Length:{通过os.path.getsize获取的本地文件实际字节数}
- 保持现有
-F形式的表单字段配置不变,cURL会自动完成所有表单内容的拼接、长度计算、头信息生成 - 修正后的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
相关产品推荐
相关产品推荐

