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

使用Etsy API上传Listing图片报错,附Python/PHP代码求解决

问题:Etsy API上传图片报错“Either a valid image file or a listing_image_id must be provided.”

尝试通过Etsy API将图片上传至Listing时,持续收到错误提示:

Either a valid image file or a listing_image_id must be provided.

以下是我改写的Python代码(基于Etsy官方PHP教程)及原PHP代码,请求排查问题:

我的Python代码

payload = {'image': open("103151318_"+str(i)+".jpg", 'rb'), 'name': "image.jpg"}
headers = {
    'Content-Type': 'multipart/form-data',
    "x-api-key": self.keystring,
    "Authorization": "Bearer " + self.token,
    'Content-Disposition': 'form-data; name="image"; filename="image.jpg"'
}

data = {"rank": rank}

response = requests.post(uri, headers=headers, files=payload, params=data)

原Etsy官方PHP代码

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://openapi.etsy.com/v3/application/shops/xxxxxxxx/listings/yyyyyyyy/images',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('image'=> new CURLFILE('/path/to/my/image.jpg')),
  CURLOPT_HTTPHEADER => array(
    'Content-Type: multipart/form-data',
    'x-api-key: 112233445566778899',
    'Authorization: Bearer abcd1234efgh5678ijkl90mnopqrst'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

问题排查与修正

错误点分析

  1. 手动设置Content-Type和Content-Disposition头:使用requests.post的files参数时,库会自动生成正确的multipart/form-data头及boundary分隔符,手动设置会破坏请求格式,导致Etsy API无法解析上传的文件。
  2. files参数格式错误:正确的格式应为字典中每个键对应一个元组(文件名, 文件对象, MIME类型),而非将文件名单独作为一个键。
  3. rank参数位置错误:rank是表单字段,应放在data参数中,而非作为URL参数(params)传递。

修正后的Python代码

# 构造正确的files参数:键为字段名,值为(文件名, 文件对象, MIME类型)
files = {
    'image': (f"103151318_{i}.jpg", open(f"103151318_{i}.jpg", 'rb'), 'image/jpeg')
}

headers = {
    "x-api-key": self.keystring,
    "Authorization": "Bearer " + self.token
}

# rank作为表单数据放在data里
data = {"rank": rank}

response = requests.post(uri, headers=headers, files=files, data=data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:13:18