我正在尝试从prestashop中的产品更新现有图像。我正在使用Python和请求以及以下代码:
import requests
import io
import mimetypes
from PIL import Image
from StringIO import StringIO
api_key = 'test'
url = "https://.../api/images/products/249/445"
file_name = 't3_6kxvzv.jpg'
fd = io.open(file_name, "rb")
content = fd.read()
fd.close()
def encode_multipart_formdata():
"""Encode files to an http multipart/form-data.
:param files: a sequence of (type, filename, value)
elements for data to be uploaded as files.
:return: headers and body.
"""
BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
CRLF = '\r\n'
L = []
L.append('--' + BOUNDARY)
L.append(
'Content-Disposition: form-data; \
name="%s"; filename="%s"' % ("image", file_name))
L.append('Content-Type: %s' % get_content_type(file_name))
L.append('')
L.append(content)
L.append('--' + BOUNDARY + '--')
L.append('')
body = CRLF.join(L)
headers = {
'Content-Type': 'multipart/form-data; boundary=%s' % BOUNDARY
}
return headers, body
def get_content_type(file_name):
"""Retrieve filename mimetype.
:param filename: file name.
:return: mimetype.
"""
return mimetypes.guess_type(file_name)[0] or 'application/octet- stream'
header, body = encode_multipart_formdata()
r = requests.put(url, data=body, auth=(api_key,""), headers= header)
# also tried data = content
r = requests.get(url, auth=(api_key,""))
i = Image.open(StringIO(r.content))
i.show()
我用
尝试了各种PUT和POST请求data = content
但只获得400状态代码。
然后我尝试获取现有图像,效果很好。
api_key具有允许PUT和POST的所有必要设置。
然后我试着阅读prestapyt如何解决这个问题,但是在导入prestapyt之后我无法按照他们的文档将产品图像添加到产品中使用:
prestashop.add("https://...api/images/products/249/445", files[('image',file_name,content)])
产生
KeyError: ('image', 't3_6kxvzv.jpg', '\xff\xd8\xff\xe0\x00\x10JFI...
然后我尝试修改 encode_multipart_formdata 和 get_content_type函数以生成类似的解决方案,但无法通过400状态代码。
我非常希望使用请求并尝试了解如何使用prestapy和交钥匙解决方案更新图片。
感谢您的时间!
我使用的文档: Prestashop http://doc.prestashop.com/display/PS16/Chapter+9+-+Image+management
prestapyt https://github.com/prestapyt/prestapyt
我能够使用请求和POST通过以下方式将图像添加到产品中:
url_2 = "https:/.../api/images/products/249"
r = requests.post(url_2, data=body, auth=(api_key,""), headers=header)
仍然无法使用PUT更改或更新图像。
答案 0 :(得分:0)
无法让PUT工作,所以改为使用DELETE和POST
<table class="table table-hover" th:if="${d.hasRecords()}">
<thead>
<tr>
<th:block th:eacth="h : ${d.header}">
<th th:colspan="${d.header.length}" th:text="${h}">Header Field</th>
</th:block>
</tr>
</thead>
<tbody>
<tr th:each="record : ${d.records}">
<th:block th:each="field : ${record}">
<td th:text="${field}">Dataset Field</td>
</th:block>
</tr>
</tbody>
</table>
解决方法工作正常,但仍然不明白为什么必须有这么复杂的方法以及为什么PUT不起作用。