params = {'file': open("test.txt", "rb"), 'name': 'upload test'}
datagen, headers = poster.encode.multipart_encode(params)
request = urllib2.Request(upload_url, datagen, headers)
result = urllib2.urlopen(request)
我使用poster库进行HTTP POST请求,它的效果很好,我很满意。
但是我想尝试一些新的东西。就像你在上面看到的那样,如果要发送文件数据,我必须打开一个文件。但是有没有办法不用真正的文件来完成这个操作呢?我们可以使用流(如StringIO)来处理数据,就像处理文件一样,对吧?但是我不太了解poster库。所以,我想知道如何使用流来实现poster库的操作。
补充
实际上,我尝试POST图像数据。我写了以下代码:
from PyQt4 import QtCore, QtGui
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2, os
register_openers()
app = QtGui.QApplication(sys.argv)
pixmap = QtGui.QPixmap("c:/test_img.png")
byte_array = QtCore.QByteArray()
buffer = QtCore.QBuffer(byte_array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, "PNG")
from cStringIO import StringIO
datagen, headers = multipart_encode({"image": StringIO(str(byte_array.toBase64()))})
request = urllib2.Request(upload_url, datagen, headers)
_rnt = urllib2.urlopen(request)
但是,我收到了这个错误:
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
_rnt = urllib2.urlopen(request)
File "C:\Python26\lib\urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "C:\Python26\lib\urllib2.py", line 397, in open
response = meth(req, response)
File "C:\Python26\lib\urllib2.py", line 510, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python26\lib\urllib2.py", line 435, in error
return self._call_chain(*args)
File "C:\Python26\lib\urllib2.py", line 369, in _call_chain
result = func(*args)
File "C:\Python26\lib\urllib2.py", line 518, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 500: Internal Server Error
params
和datagen
同时消失时自动关闭,但不能保证;在其他实现中,情况甚至更糟。 - abarnertdatagen
和headers
的输出以确保它们是合理的,并进行一个简单的测试,不涉及所有Qt
相关内容,只需发送包含所需数据的StringIO
即可。 - abarnertupload_url
是一个公开可访问的服务吗?如果不是,您是否拥有源代码并可以将其与设置说明一起发布在某个地方?这将使其他人能够帮助您测试出现问题的原因。 - abarnertQPixmap
、将该QPixmap
渲染到缓冲区中、然后对该缓冲区进行编码和发送所需的时间比直接对PNG文件进行编码和发送要长得多。 - abarnert