【发布时间】:2010-09-14 02:40:45
【问题描述】:
这几乎与Send file using POST from a Python script 重复,但我想补充一点:我需要一些能够正确处理字段和附件编码的东西。当您将包含非 ascii 字符的 unicode 字符串放入混合中时,我能够找到解决方案。此外,大多数解决方案不会对数据进行 base64 编码以保持 7 位干净。
【问题讨论】:
这几乎与Send file using POST from a Python script 重复,但我想补充一点:我需要一些能够正确处理字段和附件编码的东西。当您将包含非 ascii 字符的 unicode 字符串放入混合中时,我能够找到解决方案。此外,大多数解决方案不会对数据进行 base64 编码以保持 7 位干净。
【问题讨论】:
我能想到的最好的事情就是自己编码。这个子程序怎么样?
from urllib2 import Request, urlopen
from binascii import b2a_base64
def b64open(url, postdata):
req = Request(url, b2a_base64(postdata), headers={'Content-Transfer-Encoding': 'base64'})
return urlopen(req)
conn = b64open("http://www.whatever.com/script.cgi", u"Liberté Égalité Fraternité")
# returns a file-like object
(好的,所以这段代码只是发送 POST 数据。但您显然想要多部分编码的数据,就像您单击“上传文件”按钮一样,对吧?嗯,这是我在这里和您链接的问题的答案。)
【讨论】:
PyCURL 提供了一个从 Python 到 CURL 的接口。
http://curl.haxx.se/libcurl/python/
Curl 将满足您的所有需求。它可以正确传输二进制文件,并支持多种编码。但是,您必须确保在 POST 文件时将正确的字符编码作为自定义标头。
具体来说,您可能需要进行“文件上传”样式的 POST:
http://curl.haxx.se/docs/httpscripting.html(第 4.3 节)
使用 curl(或任何其他 HTTP 客户端)您可能需要设置内容编码:
内容类型:文本/html; charset=UTF-8
另外,请注意请求标头必须是 ascii,这包括 url(因此请确保正确转义可能的 unicode URL。有 HTTP 标头的 unicode 转义)最近在 Python 中修复:
http://bugs.python.org/issue3300
我希望这会有所帮助,有更多关于该主题的信息,包括在您的服务器上设置您的默认字符集等。
【讨论】:
只需使用这个库并发送文件。
【讨论】: