使用POST从Python脚本发送文件
时间:2020-03-06 14:53:42 来源:igfitidea点击:
这是从Python脚本使用POST发送文件时几乎重复的操作,但我想说明一下:我需要一些能够正确处理字段和添加文件编码的文件。当我们将包含非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/
卷毛将满足所有需求。它可以正确传输二进制文件,并支持多种编码。但是,在发布文件时,必须确保正确的字符编码作为自定义标头。
具体来说,我们可能需要执行"文件上传"样式的POST:
http://curl.haxx.se/docs/httpscripting.html(第4.3节)
使用curl(或者任何其他HTTP客户端),我们可能必须设置内容编码:
内容类型:text / html;字符集= UTF-8
另外,请注意,请求标头必须为ascii,其中包括
网址(因此请确保我们正确地转义了可能的unicode网址。
HTTP标头使用unicode转义)最近已在Python中修复:
http://bugs.python.org/issue3300
希望对我们有所帮助,有关该主题的更多信息,包括在服务器上设置默认字符集等。
只需使用该库并发送文件即可。
http://github.com/seisen/urllib2_file/