7

ユーザーが画像を Google App Engine にアップロードできるようにしたい。私は次のものを持っています(Python):

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>

その後、次のように処理されます。

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()

ただし、画像をアップロードしようとすると、「Book.png」としましょう。次のエラーが表示されます。 BadValueError: Expected str, got u'Book.png'

何が起こっているのですか?私はかなり長い間 GAE を使用してきましたが、ブロブを使用する必要があったのはこれが初めてです。

私はこのリンクを使用しました: ndbではなくdbを使用するhttps://developers.google.com/appengine/docs/python/images/usingimages 。また、最初にリンクのように画像を変数に保存してから、保存しようとしました storedInfo = self.request.get('image') : imagedata.image = ndb.Blob(storedInfo) これもエラーになります: AttributeError: 'module' object has no attribute 'Blob' よろしくお願いします。

4

3 に答える 3

5

ドキュメントには、HTML フォームを使用して Blobstore にファイルをアップロードする方法を説明する優れた例があります: https://developers.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob

フォームはによって生成された URL を指す必要があり、次のようなatblobstore.create_upload_url('/foo')のサブクラスが存在する必要があります。BlobstoreUploadHandler/foo

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()

ImageDataこれを機能させるには、imagein が を参照するようにデータ モデルを変更する必要がありますndb.BlobKeyProperty()

によって生成された URL から簡単に画像を提供できimages.get_serving_url(imagedata.image)、オプションでサイズ変更とトリミングを行うことができます。

于 2013-10-09T16:49:06.197 に答える
3

enctype="multipart/form-data"これを機能させるには、フォームに 追加する必要があります

<form name = "input" action = "/register" method = "post" enctype="multipart/form-data">
    name: <input type = "text" name = "name">
    image: <input type = "file" name = "image">
</form>
于 2013-09-20T14:35:40.257 に答える