从Python脚本使用POST发送文件
这几乎是一个和从Python脚本使用POST发送文件相同的问题,但我想补充一点:我需要一个能够正确处理字段和附加文件编码的方案。我找到的解决方案在处理包含非ASCII字符的Unicode字符串时会出问题。而且,大多数解决方案没有对数据进行base64编码,这样就不能保持7位干净。
3 个回答
只需要使用这个库,然后把文件发送进去就可以了。
PyCURL 是一个让你可以在 Python 中使用 CURL 的工具。
http://curl.haxx.se/libcurl/python/
Curl 可以满足你所有的需求。它可以正确地传输二进制文件,并且支持多种编码方式。不过,当你上传文件时,记得要在自定义头信息中设置正确的字符编码。
具体来说,你可能需要使用“文件上传”风格的 POST 请求:
http://curl.haxx.se/docs/httpscripting.html (第 4.3 节)
使用 curl(或者其他 HTTP 客户端)时,你可能需要设置内容编码:
Content-Type: text/html; charset=UTF-8
另外,要注意请求头必须是 ASCII 格式,这也包括 URL(所以要确保你的 URL 中的 Unicode 字符被正确转义。HTTP 头信息中有 Unicode 转义的方式)。这个问题最近在 Python 中得到了修复:
http://bugs.python.org/issue3300
希望这些信息对你有帮助,关于这个话题还有更多的信息,包括如何在你的服务器上设置默认字符集等等。
我能想到的最好办法就是自己进行编码。你觉得这个小程序怎么样?
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数据。但你显然想要的是多部分编码的数据,就像你点击了“上传文件”按钮一样,对吧?其实,这只是把我这里的内容和你链接的问题中的答案结合起来,非常简单。)