6

ユーザー(Androidアプリ)から写真を取得し、プログラムでblobstoreに保存するアプリエンジンエンドポイントAPIを構築しています。次に、blob_keyをデータストアに保存します。コードは次のようになります。

  • 最初に私は私を通して画像を受け取りまし@endpoint.methodmessages.BytesField

    image_data = messages.BytesField(1、required = True)

次に、次のようにblobstoreに保存します。

from google.appengine.api import files

def save_image(data):
  # Create the file
  file_name = files.blobstore.create(mime_type='image/png')

  # Open the file and write to it
  with files.open(file_name, 'a') as f:
    f.write('data')

  # Finalize the file. Do this before attempting to read it.
  files.finalize(file_name)

  # Get the file's blob key
  blob_key = files.blobstore.get_blob_key(file_name)
  return blob_key # which is then saved to datastore

今、私は画像を提供したいと思います。次のコードをエンドポイントAPIに適合させる方法がわかりません。

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    self.send_blob(blob_info)

結局、私はこのようなサービング手順を想像します:

  • @ endpoints.method:

  • データストアからblob_keyを取得します

  • blob_keyで画像を取得する

  • StuffResponseMessageに画像を追加します

  • StuffResponseMessageをフロントエンド(Androidアプリ)に送信します

私のアプローチは、ユーザーのプライバシーを保護したいからです。これをうまく行う方法について何か考えはありますか?私のコードスニペットは通常、Google開発者チュートリアルからのものです。


編集:

画像を取得するためにデータストアから次のメソッドにblob_keyを渡す方法がわかりません。

from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    self.send_blob(blob_info)

resourceとにかく、中身は?

4

1 に答える 1

2

私はあなたがURLパスから取得した文字列として提供したいものresourceのオブジェクトであると信じています。メソッドのBlobKeyソースを見ると、オブジェクトまたは文字列の引数を取る関数が使用されています。google.appengine.ext.blobstore.BlobInfoget__normalize_and_convert_keysBlobKey

ブロブが画像の場合は、Androidアプリに代わりに配信URLを送信するのが最適StuffResponseMessage な場合があります。グーグルのサービングブロブドキュメントから:

画像を提供している場合、より効率的で潜在的に安価な方法は、send_blobではなくApp EngineImagesAPIを使用してget_serving_urlを使用することです。get_serving_url関数を使用すると、AppEngineインスタンスを経由せずに画像を直接提供できます。

したがって、画像を保存した後、返されたblob_key(上記の方法に従ってsave_image(data))提供URLを作成し、Androidアプリで返されたURLから画像を取得します。もちろん、これはプライバシー保護なしで画像のURLを公開することを意味します。

保護を使用して実行する場合は、BlobReader クラスを使用して、ファイルのようなインターフェイスでblobを読み取ります。remote.Serviceハンドラーではなくサブクラスで使用するため、ServingBlobの例のメソッド/クラスを使用することはできません。

于 2013-03-23T19:17:43.633 に答える