我正在 Selectel 上编写文件上传器。简化的代码如下所示:
filename = 'example_watermarked.jpg'
headers['Content-Length'] = str(os.path.getsize(filename))
files = {
'file' : open(filename, 'rb')
}
url = auth['url'] + 'images/python_uploader/' + filename
response = requests.put(url, files=files, headers=headers)
原来是这样的——源文件是 38158 字节。Selectel 上的文件为 38317 字节。当然,该文件不会打开。“额外”的 159 个字节从何而来?我究竟做错了什么?
PSos.path.getsize(filename)返回 38158 即 正确的尺寸。
PPS 我通过 Postman 尝试过,就像我下载了一个损坏的文件一样。只是现在它是 38355 字节。
更新: 以下块已添加到开头:
--de966cbba4ab406da3dd088e63bd9c7f
Content-Disposition: form-data; name="file";
filename="example_watermarked.jpg"
最后,像这样:
--de966cbba4ab406da3dd088e63bd9c7f--
其余的是二进制数据。
我写信给技术支持,这是他们告诉我的:
考虑到他们的更正,我重写了我的代码,一切正常
一切都归结为这样一个事实,即 Selectel API 无法正确处理使用RFC 7578
Content-Type: multipart/form-data的 POST 方法发送的文件。例如,请参见此处:生成 HTTP 请求、POST 方法、本文中的示例请求:
在您的问题
de966cbba4ab406da3dd088e63bd9c7f中,这是边界,即 表示数据块边界的标签。收到起始标签时,必须切断其后到双换行符和结束标签的服务数据。据我了解,缺乏对这个请求选项的支持将导致文件在发送之前必须完全加载到内存中,如果这个文件“重”几个千兆字节,那么这已经成为一个问题.