从Python脚本中使用POST发送文件

7

这几乎是从Python脚本发送文件的重复内容,但我想要添加一个警告:我需要的是能够正确处理字段和附加文件编码的解决方案。当你将包含非ASCII字符的Unicode字符串混合在一起时,我能找到的大多数解决方案都会出现问题。此外,大多数解决方案不会对数据进行Base64编码以保持7位清洁。

3个回答

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:

http://curl.haxx.se/docs/httpscripting.html(第4.3节)

使用curl(或任何其他HTTP客户端),您可能需要设置内容编码:

Content-Type:text/html;charset=UTF-8

另外,请注意,请求头必须是ASCII字符集,这包括URL(因此,请确保正确转义可能是Unicode的URL。有HTTP头的Unicode转义)。最近在Python中已经修复了这个问题:

http://bugs.python.org/issue3300

希望这可以帮到你,关于该主题还有更多信息,包括在服务器上设置默认字符集等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接