从Python脚本使用POST发送文件

时间:2008-09-29 20:31:38

标签: python encoding post

这是Send file using POST from a Python script的几乎重复,但我想补充一点:我需要能够正确处理字段和附加文件编码的内容。当你将包含非ascii字符的unicode字符串放入混合中时,我已经能够找到解决方案。此外,大多数解决方案都不会对数据进行64位编码,以保持7位清洁。

3 个答案:

答案 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)

只需使用此库并发送文件。

http://github.com/seisen/urllib2_file/