【发布时间】:2023-03-17 03:53:01
【问题描述】:
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)
我使用海报库来发布 HTTP。它运作良好。我对此很满意。
但我想尝试一下。如您在上面看到的,要发送文件数据,我必须打开一个文件。但是有没有办法不制作一个真正的文件来做到这一点?我们可以使用 STREAM,比如StringIO,像处理文件一样处理数据,对吧?但是,我不太了解poster。所以,我想知道使用poster 的STREAM 的方法。
添加
实际上,我尝试发布图像数据。我在下面写了这个
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
【问题讨论】:
-
这与您的问题无关,但您意识到您的代码永远不会关闭 text.txt,对吧?在 CPython 中,它可能会在
params和datagen都消失后自动关闭,但不能保证;在其他实现中,情况更糟。 -
同样,可能与您的新问题无关,但是:我认为您不需要对数据进行 base64 处理,因为它们已经在 MIME 正文中正确编码 - 您将需要在另一侧进行额外的 base64 解码。另外,为什么要从 PNG 文件创建像素图,然后将其作为 PNG 保存到缓冲区,而不是仅仅读取 PNG 文件(或只是将其传递给
poster)? -
您收到的错误是“HTTP 错误 500:内部服务器错误”。这意味着 Web 服务器中的错误,或者更有可能是它为您的 URL 运行的后端脚本。如果该 URL 通常是可靠的,则可能意味着您发送的垃圾远远超出了任何人预期的范围,您发现了一个没有人测试过的错误。尝试保存缓冲区以确保它确实是 PNG,保存
datagen和headers的输出以确保它们是合理的,并在没有所有Qt内容的情况下进行更简单的测试,您只需发送 @ 987654333@ 与您想要结束的数据。 -
upload_url是可公开访问的服务吗?或者,如果没有,您是否有来源并且可以在某处发布(连同设置说明)?这样可以让其他人帮助您测试出了什么问题。 -
@abarnert 当然,我可以保存为 PNG 文件并将其发送给海报。但是,我希望减少处理时间,所以就这样尝试了。 :) 而且,我会检查
upload_url,但这不是我的职责,所以它会以某种方式进行。