使用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;
问题排查与修正
错误点分析
- 手动设置
Content-Type和Content-Disposition头:使用requests.post的files参数时,库会自动生成正确的multipart/form-data头及boundary分隔符,手动设置会破坏请求格式,导致Etsy API无法解析上传的文件。 files参数格式错误:正确的格式应为字典中每个键对应一个元组(文件名, 文件对象, MIME类型),而非将文件名单独作为一个键。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
相关产品推荐
相关产品推荐

