相关疑难解决方法(0)

正确格式化multipart/form-data主体

介绍

背景

我正在编写一个脚本,使用RFC 2388中multipart/form-data定义的内容类型上传包含文件的内容.从长远来看,我正在尝试提供一个简单的Python脚本来为github上传二进制包,这涉及将类似表格的数据发送到Amazon S3.

有关

这个问题已经问过如何做到这一点,但到目前为止它还没有得到公认的答案,而且目前这两个答案中更有用的是指出这些方法,这些方法反过来手动构建整个消息.我有点担心这种方法,特别是关于字符集和二进制内容.

还有这个问题,其目前得分最高的答案暗示了该MultipartPostHandler模块.但这与我提到的食谱没什么不同,因此我的担忧也适用于那些.

关注

二进制内容

RFC 2388第4.3节明确规定除非另有声明,否则内容应为7位,因此可能需要Content-Transfer-Encoding标头.这是否意味着我必须对Base64编码二进制文件内容?或者Content-Transfer-Encoding: 8bit对于任意文件是否足够?或者应该读一下Content-Transfer-Encoding: binary

标题字段的字符集

一般的filename标题字段,特别是标题字段,默认情况下仅为ASCII.我希望我的方法能够传递非ASCII文件名.我知道,对于我目前为github上传内容的应用程序,我可能不需要它,因为文件名是在一个单独的字段中给出的.但我希望我的代码可以重用,所以我宁愿以一致的方式编码文件名参数.RFC 2388第4.4节建议RFC 2231中引入的格式,例如filename*=utf-8''t%C3%A4st.txt.

我的方法

使用python库

由于multipart/form-data本质上是一种MIME类型,我认为它应该是可以使用的email从标准Python库撰写我的职务.特别是非ASCII头字段的相当复杂的处理是我想委托的.

到目前为止工作

所以我写了下面的代码:

#!/usr/bin/python3.2

import email.charset
import email.generator
import email.header
import email.mime.application
import email.mime.multipart
import email.mime.text
import io
import sys

class …
Run Code Online (Sandbox Code Playgroud)

python mime http multipartform-data amazon-s3

9
推荐指数
1
解决办法
6101
查看次数

使用multipart/form-data时,为什么没有正确发送带有Unicode的POST名称?

我想发送一个带有附加文件的POST请求,尽管有些字段名称中包含Unicode字符.但是服务器没有正确接收它们,如下所示:

>>> # normal, without unicode
>>> resp = requests.post('http://httpbin.org/post', data={'snowman': 'hello'}, files={('kitten.jpg', open('kitten.jpg', 'rb'))}).json()['form']
>>> resp
{u'snowman': u'hello'}
>>>
>>> # with unicode, see that the name has become 'null'
>>> resp = requests.post('http://httpbin.org/post', data={'?': 'hello'}, files={('kitten.jpg', open('kitten.jpg', 'rb'))}).json()['form']
>>> resp
{u'null': u'hello'}
>>>
>>> # it works without the image
>>> resp = requests.post('http://httpbin.org/post', data={'?': 'hello'}).json()['form']
>>> resp
{u'\u2603': u'hello'}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

python unicode http multipartform-data python-requests

6
推荐指数
1
解决办法
2996
查看次数