3
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用にPOSTします。それはうまくいきます。満足しています。

でも何かやってみたいです。上記のように、ファイルデータを送信するには、ファイルを開く必要があります。しかし、それを行うために実際のファイルを作成しない方法はありますか?のようなSTREAMを使用してStringIO、ファイルのようなデータを処理できますよね?posterしかし、私は深く知りません。だから、STREAMをで使う方法を知りたいです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
4

1 に答える 1

4

fileparamは、ファイルオブジェクトを渡す場所です。では、代わりにファイルのようなオブジェクトを渡すとどうなりますか?

>>> 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'}

うまくいったようです。

ドキュメントには何と書かれていますか?

値は、文字列パラメータ値、またはパラメータ値として使用するファイルのようなオブジェクトのいずれかです。ファイルのようなオブジェクトは、.read()と.fileno()のいずれか、または.seek()と.tell()の両方をサポートする必要があります。

したがって、StringIOオブジェクトはとをサポートseek()しているため、オブジェクトを使用できますtell()

しかし、そうする必要はありません。生の文字列だけを使用できるはずです。それを試して見てみましょう:

>>> 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'}

それを見てください、ドキュメントは正しいです。

于 2012-11-13T02:01:02.863 に答える