首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python :通过poster在stringIO中发布数据?

python :通过poster在stringIO中发布数据?
EN

Stack Overflow用户
提问于 2012-11-13 09:55:44
回答 1查看 2.6K关注 0票数 3
代码语言:javascript
复制
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发帖。它工作得很好。我对此很满意。

但我想试一试。正如您在上面看到的,要发送文件数据,我必须打开一个文件。但是有没有办法不制作一个真正的文件来做到这一点呢?我们可以使用像StringIO这样的流来像处理文件一样处理数据,对吧?但是,我对poster并不是很了解。所以,我想知道在poster中使用流的方法。

已添加

实际上,我试着发布图像数据。我在下面写了这个

代码语言:javascript
复制
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)

但是,我收到这个错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-13 10:01:03

file参数是传递文件对象的位置。那么,如果你传递一个类似文件的对象,会发生什么呢?

代码语言:javascript
复制
>>> params = {'file': cStringIO.StringIO('upload test data'), 'name': 'upload test'}
>>> datagen, headers = poster.encode.multipart_encode(params)
>>> headers
{'Content-Length': '317', 'Content-Type': 'multipart/form-data; boundary=0c56082b1e134424a918b2b083391467'}

看起来起作用了。

the documentation怎么说?

值可以是字符串参数值,也可以是用作参数值的类似文件的对象。类文件对象必须支持.read()和.fileno()或同时支持.seek()和.tell()。

因此,您可以使用StringIO对象,因为它们支持seek()tell()

但你没必要这么做。您应该能够只使用原始字符串。让我们试一试,看看:

代码语言:javascript
复制
>>> params = {'file': 'upload test data', 'name': 'upload test'}
>>> datagen, headers = poster.encode.multipart_encode(params)
>>> headers
{'Content-Length': '317', 'Content-Type': 'multipart/form-data; boundary=0c56082b1e134424a918b2b083391467'}

看看这个,文档是正确的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13354589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档