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

将Shopify图片上传的curl命令转为Python Requests时遇400错误求助

Shopify图片上传转Python Requests请求报错排查

背景

正在按照Shopify官方教程实现图片上传功能,需要将以下curl命令转换为Python Requests请求。文件由用户上传,通过Django的request.FILES['filename']将file变量传入处理函数:

curl -v \
  -F "Content-Type=image/png" \
  -F "success_action_status=201" \
  -F "acl=private" \
  -F "key=tmp/45732462614/products/7156c27e-0331-4bd0-b758-f345afaa90d1/watches_comparison.png" \
  -F "x-goog-date=20221024T181157Z" \
  -F "x-goog-credential=merchant-assets@shopify-tiers.iam.gserviceaccount.com/20221024/auto/storage/goog4_request" \
  -F "x-goog-algorithm=GOOG4-RSA-SHA256" \
  -F "x-goog-signature=039cb87e2787029b56f498beb2deb3b9c34d96da642c1955f79225793f853760906abbd894933c5b434899d315da13956b1f67d8be54f470571d7ac1487621766a2697dfb8699c57d4e67a8b36ea993fde0f888b8d1c8bd3f33539d8583936bc13f9001ea3e6d401de6ad7ad2ae52d722073caf250340d5b0e92032d7ad9e0ec560848b55ec0f943595578a1d6cae53cd222d719acb363ba2c825e3506a52b545dec5be57074f8b1b0d58298a0b4311016752f4cdb955b89508376c38f8b2755fce2423acb3f592a6f240a21d8d2f51c5f740a61a40ca54769a736d73418253ecdf685e15cfaf7284e6e4d5a784a63d0569a9c0cffb660028f659e68a68fb80e" \
  -F "policy=eyJjb25kaXRpb25zIjpbeyJDb250ZW50LVR5cGUiOiJpbWFnZVwvcG5nIn0seyJzdWNjZXNzX2FjdGlvbl9zdGF0dXMiOiIyMDEifSx7ImFjbCI6InByaXZhdGUifSxbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwxLDIwOTcxNTIwXSx7ImJ1Y2tldCI6InNob3BpZnktc3RhZ2VkLXVwbG9hZHMifSx7ImtleSI6InRtcFwvZ2NzXC80NTczMjQ2MjYxNFwvcHJvZHVjdHNcLzcxNTZjMjdlLTAzMzEtNGJkMC1iNzU4LWYzNDVhZmFhOTBkMVwvd2F0Y2hlc19jb21wYXJpc29uLnBuZyJ9LHsieC1nb29nLWRhdGUiOiIyMDIyMTAyNFQxODExNTdaIn0seyJ4LWdvb2ctY3JlZGVudGlhbCI6Im1lcmNoYW50LWFzc2V0c0BzaG9waWZ5LXRpZXJzLmlhbS5nc2VydmljZWFjY291bnQuY29tXC8yMDIyMTAyNFwvYXV0b1wvc3RvcmFnZVwvZ29vZzRfcmVxdWVzdCJ9LHsieC1nb29nLWFsZ29yaXRobSI6IkdPT0c0LVJTQS1TSEEyNTYifV0sImV4cGlyYXRpb24iOiIyMDIyLTEwLTI1VDE4OjExOjU3WiJ9" \
  -F "file=@/Users/shopifyemployee/Desktop/watches_comparison.png" \
   "https://shopify-staged-uploads.storage.googleapis.com/"

尝试的代码及错误

初始代码(ChatGPT生成)

def uploadImage(stagedTarget, file):
    parameters = stagedTarget["parameters"]
    url = stagedTarget["url"]
    files = {
        'file': file,
    }
    data = {
        'Content-Type': parameters[0]['value'],
        'success_action_status': parameters[1]['value'],
        'acl': parameters[2]['value'],
        'key': parameters[3]['value'],
        'x-goog-date': parameters[4]['value'],
        'x-goog-credential': parameters[5]['value'],
        'x-goog-algorithm': parameters[6]['value'],
        'x-goog-signature': parameters[7]['value'],
        'policy': parameters[8]['value'],
    }
    print(f"{url = }, {data = }")
    response = requests.post(url, files=files, data=data)
    print(f"{response.status_code = }")
    print(f"{response.text = }")

    response = response.content
    response = json.loads(response)

报错信息

web_1      | response.status_code = 400
web_1      | response.text = "<?xml version='1.0' encoding='UTF-8'?><Error><Code>EntityTooSmall</Code><Message>Your proposed upload is smaller than the minimum object size specified in your Policy Document.</Message><Details>Content-length smaller than lower bound on range</Details></Error>"

注:文件大小为46KB,尝试更大文件仍报错,但直接执行curl命令上传同类本地图片可正常完成。

修改后的代码

parameters = stagedTarget["parameters"]
    url = stagedTarget["url"]
    headers = {
        'Content-Type': 'multipart/form-data'
    }
    data = {
        'Content-Type': parameters[0]['value'],
        'success_action_status': parameters[1]['value'],
        'acl': parameters[2]['value'],
        'key': parameters[3]['value'],
        'x-goog-date': parameters[4]['value'],
        'x-goog-credential': parameters[5]['value'],
        'x-goog-algorithm': parameters[6]['value'],
        'x-goog-signature': parameters[7]['value'],
        'policy': parameters[8]['value'],
        'file': file,
    }
    response = requests.post(url, headers=headers, data=data)

报错信息

web_1      | response.status_code = 400
web_1      | response.text = 'Bad content type.  Please use multipart.'

疑问

请问哪里操作出错了?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:32:03