这是Send file using POST from a Python script的几乎重复,但我想补充一点:我需要能够正确处理字段和附加文件编码的内容。当你将包含非ascii字符的unicode字符串放入混合中时,我已经能够找到解决方案。此外,大多数解决方案都不会对数据进行64位编码,以保持7位清洁。
答案 0 :(得分:5)
我能想到的最好的事情就是自己编码。这个子程序怎么样?
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数据。但你显然想要多部分编码的数据,好像你点击了一个“上传文件”按钮,对吧?嗯,这是我在这里和我所拥有的非常简单的组合您链接的问题的答案。)
答案 1 :(得分:1)
PyCURL从Python提供了一个CURL接口。
http://curl.haxx.se/libcurl/python/
Curl会做你所需要的一切。它可以正确传输二进制文件,并支持许多编码。但是,在POST文件时,必须确保将正确的字符编码作为自定义标头。
具体来说,您可能需要执行'文件上传'样式POST:
http://curl.haxx.se/docs/httpscripting.html(第4.3节)
使用curl(或任何其他HTTP客户端),您可能必须设置内容编码:
Content-Type:text / html;字符集= UTF-8
另外,请注意请求标头必须是ascii,这包括 url(所以请确保你正确地逃脱了你的unicode URL。有 HTTP标头的unicode转义)最近在Python中修复了这个问题:
http://bugs.python.org/issue3300
我希望这会有所帮助,有关于该主题的更多信息,包括在您的服务器上设置默认字符集等。
答案 2 :(得分:1)
只需使用此库并发送文件。