2013-08-23 28 views
6

ユーザーがGoogle App Engineに画像をアップロードできるようにしたい。しかし、Google App Engine(Python) - ファイルをアップロードする(画像)

class AddProduct(webapp2.RequestHandler): 
    def post(self): 
     imagedata = ImageData(parent=image_key(image_name)) 
     imagedata.name = self.request.get('name') 
     imagedata.image = self.request.get('image') 
     imagedata.put() 

class ImageData(ndb.Model): 
    name = ndb.StringProperty(indexed=False) 
    image = ndb.BlobProperty() 

情報はフォームを使用してユーザによって提出された(HTML)::

<form name = "input" action = "/register" method = "post"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 

それまでに処理され、私は、次の(パイソン)を持っています画像をアップロードしようとすると「Book.png」と言うと、エラーが表示されます: BadValueError: Expected str, got u'Book.png'

何が起こっているか考えてみませんか?私はかなり長い間GAEで作業してきましたが、ブロブを使用するのは初めてです。

私はこのリンクを使用しました:https://developers.google.com/appengine/docs/python/images/usingimages これはdbを使用し、ndbでは使用しません。 私はまた、最初のリンクのように変数に画像を保存しようとした: storedInfo = self.request.get('image') し、それを保存する: imagedata.image = ndb.Blob(storedInfo) また私にエラー与える:事前に感謝を AttributeError: 'module' object has no attribute 'Blob' を。

+2

エラーを持っている必要がありますことを語っている:

だけで

imagedata.image = self.request.get('image') 

置き換えますBlobの値としてUnicodeオブジェクトを設定しようとしています。この場合はファイルデータではなくファイル名であるように見えます(どのようにt o webapp2のstrとして生データを取得するので、コメントとして投稿するだけです) – geoffspear

+1

データストアよりもblobstore APIを使用していない理由がありますか? https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob – Faisal

+1

Woobleさんありがとうございますが、私は何を提案しますか? ファイサル、db(私はndbを使用しています)とwebapp(私はwebapp2を使用しています)が必要なので、私はそれを使用していません。 – Albraa

答えて

2

偉大な例では、HTMLフォームを使用してブロブストアにファイルをアップロードする方法について説明しますドキュメントであり、これは

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
    name: <input type = "text" name = "name"> 
    image: <input type = "file" name = "image"> 
</form> 
4

を動作させるためにあなたがあなたのフォームにenctype="multipart/form-data"を追加する必要があります。https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

フォームはblobstore.create_upload_url('/foo')によって生成されたURLを指している必要がありますし、このような/fooBlobstoreUploadHandlerのサブクラスがあるはずです:

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): 
    def post(self): 
    upload_files = self.get_uploads('file') 
    blob_info = upload_files[0] 
    imagedata = ImageData(parent=image_key(image_name)) 
    imagedata.name = self.request.get('name') 
    imagedata.image = blob_info.key() 
    imagedata.put() 

これを有効にするには、ImageDataimagendb.BlobKeyProperty()が含まれるようにデータモデルを変更する必要があります。

images.get_serving_url(imagedata.image)によって生成されたURLからイメージを配信することもできます。オプションでサイズを変更してトリミングすることもできます。

7

同じprobがある。 「

imagedata.image = str(self.request.get('image')) 

もフォームがにenctype = "multipart/form-データ

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data"> 
関連する問題