3

ユーザーがアップロードした画像を保存するために、GAE python アプリで s3 (boto を使用) をセットアップしようとしています。現在、次のエラーが発生します。

File "/Users/phyzikz/project/boto/s3/key.py", line 936, in set_contents_from_file spos = fp.tell()
AttributeError: 'str' object has no attribute 'tell'

なぜこれが起こっているのか途方に暮れています.アップロードされたファイルはpngでなければなりません. アップロードを行うコードは次のとおりです。

class Settings(Handler):
    def get(self):
        self.render('settings.html')

    def post(self):
        image = self.request.get('image')

        if image:
            connection = S3Connection('<ak>','<sak>')
            bucket = connection.create_bucket('<s3bucket>')
            k = Key(bucket)
            k.key = '/pictures/users/'+ str(self.user.key().id())
            k.set_contents_from_file(image)

それが役立つ場合、デバッグ中に set_contents_from_file(image) を set_contents_from_string('some string') に置き換えると、美しく機能しました。私は単純なものが欠けているに違いありません。html は次のとおりです。

<form method='post' action='/settings' enctype='multipart/form-data'>
    <input type='file' name='image'>
    <input type='submit'>
</form>

免責事項:私はpythonとSOの両方に不慣れです(これは私の最初の質問です!)必要に応じて質問の言い回しを改善するための編集をいただければ幸いです。

4

2 に答える 2

6

ファイルオブジェクトのように見えるように、画像を StringIO インスタンスでラップする必要があります

Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = "123"
>>> from StringIO import StringIO
>>> y = StringIO(x)
>>> y.tell()
0
>>> 

だからあなたの場合、あなたは

k.set_contents_from_file(StringIO(image))
于 2012-09-09T09:54:12.453 に答える