2

ファイルのようなオブジェクトを引数として取るpythonライブラリ(poster )を使用しています。ドキュメントには次のように記載されています。

ファイルのようなオブジェクトは、.read() と .fileno() のいずれか、または .seek() と .tell() の両方をサポートする必要があります。

Pythonopen関数を使用してライブラリを試してみましたが、正常に動作します。現在、次を使用して URL から画像をダウンロードしています。

access_token = "XXXXXXXXXXXXXXXXXXXXX"
postPhotoUrl = "https://graph.facebook.com/me/photos?access_token=%s" % access_token

register_openers()

# get image from external URL
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())

### data, headers = multipart_encode({"source":open("file.png")}) <- WORKS FINE
data, headers = multipart_encode({"source":data})
request = urllib2.Request(postPhotoUrl,data,headers)

編集:私の目標は、外部 URL から画像を取得し、Facebook グラフ API を使用して投稿することです。Pythonopen関数を使用しても問題はありません。StringIO を使用しようとすると、POST 要求で本文が送信されません。

4

1 に答える 1

4

パッケージを使用して HTTP のストリーミング アップロードを行うことを目的としている場合は、画像データを PILオブジェクトposterに変換するべきではありません。Imageただやって...

data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())

data...次に、変数を に渡すことができますposter

もちろん、最初に PIL で画像を変換したい場合を除きますが、おそらく質問でそのことを言及する必要があります。

アップデート

で失敗する理由については、開いているファイルのファイル名をチェックし、それを使用して正しいか何かを判断しStringIOている可能性があります。posterContent-TypeStringIO

私はパッケージを使用したことがなく、例はあまり包括的ではありませんが、次のheadersようなものを呼び出すときに変数の違いを確認する価値があるかもしれません...

from poster.encode import multipart_encode

data = open('example.png', 'rb')
datagen, headers = multipart_encode({"image1": data})

...対...

from poster.encode import multipart_encode

data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
datagen, headers = multipart_encode({"image1": data})

アップデート #2

私はそのことについて正しかったようContent-Typeです。168~174行目のposterソースコードからencode.py

        if hasattr(value, 'read'):
            # Looks like a file object
            filename = getattr(value, 'name', None)
            if filename is not None:
                filetype = mimetypes.guess_type(filename)[0]
            else:
                filetype = None

filename…の場合は他の問題があるかもしれませんがNone。これを試して...

from poster.encode import multipart_encode, MultipartParam

data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
param = MultipartParam(name='source',
                       filename='image.png',
                       filetype='image/png',
                       fileobj=data)
datagen, headers = multipart_encode({"source": param})
于 2013-05-19T16:42:05.547 に答える