使用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/