这几乎是使用 Python 脚本中的 POST 发送文件的重复,但我想补充一点:我需要一些能够正确处理字段和附加文件的编码的东西。当您将包含非 ascii 字符的 unicode 字符串放入混合中时,我能够找到解决方案。此外,大多数解决方案不会对数据进行 base64 编码以保持 7 位干净。
3 回答
我能想到的最好的事情就是自己编码。这个子程序怎么样?
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/
卷曲会做你需要的一切。它可以正确传输二进制文件,并支持多种编码。但是,您必须确保在 POST 文件时将正确的字符编码作为自定义标头。
具体来说,您可能需要进行“文件上传”样式的 POST:
http://curl.haxx.se/docs/httpscripting.html(第 4.3 节)
使用 curl(或任何其他 HTTP 客户端),您可能必须设置内容编码:
内容类型:文本/html;字符集=UTF-8
另外,请注意请求标头必须是 ascii,其中包括 url(因此请确保正确转义可能的 unicode URL。HTTP 标头有 unicode 转义)最近在 Python 中修复了此问题:
http://bugs.python.org/issue3300
我希望这会有所帮助,有关该主题的更多信息,包括在服务器上设置默认字符集等。
只需使用这个库并发送文件。