6

私はユーザー(アンドロイドアプリ)から画像を取得し、プログラムによってblobstoreに保存するアプリケーションエンジンエンドポイントAPIを構築しています。次に、データストアにblob_keyを保存します。コードは次のようになります:私はその後app-engineエンドポイント経由のblobstoreイメージapi

(=真に必要な、1)

IMAGE_DATA = messages.BytesField:

  • まず、私は私の@endpoint.methodmessages.BytesFieldなどを介して画像を受信しました

    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 
    

    今、私はイメージを提供したいと思いますバック。 @のendpoints.methodで

    • 私はこのようなサービス提供の手順を想像最後に

      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) 
      

      :私は私のエンドポイントのAPIに次のコードに合わせてどのように表示されていません

    • GET blob_keyデータストアから

    • blob_keyの画像を得る

    • は、フロントエンド(アンドロイドアプリ)私は、ユーザーのプライバシーを保護するため

    私のアプローチがあるにStuffResponseMessage

  • に送信StuffResponseMessageを画像を追加します。どのようにこれを行うにはどのような考え? My code snippets are generally from the google developer tutorial


    EDIT:

    私は画像を取得するには、次のメソッドにデータストアから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何ですか?

+1

Python 2.7を使用している場合は、 'from __future__ import with_statement'は必要ありません。 – bossylobster

+0

ああ。ありがとう、@ bossylobster。私はそれを取り出した。 – learner

答えて

2

私はresourceが、URLパスから取得した文字列として、サービスしたいオブジェクトのと考えています。 google.appengine.ext.blobstore.BlobInfoのソースを見ると、getメソッドでは、オブジェクトまたは文字列BlobKeyの引数をとる関数__normalize_and_convert_keysが使用されます。

ブロブが画像の場合は、AndroidアプリにサービスURL(StuffResponseMessage)を送信することをおすすめします。 Googleのは、ブロブドキュメントサービングから:あなたが画像を提供している場合は

を、より効率的かつ潜在的に安価な方法はsend_blobではなく、App Engineの画像のAPIを使用してget_serving_urlを使用することです。 get_serving_url関数を使用すると、App Engineインスタンスを経由することなく、直接画像を提供できます。

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

保護する場合は、BlobReaderclassを使用して、blobをファイルのようなインターフェイスで読み取ってください。ハンドラではなくremote.Serviceサブクラスで行うので、メソッド/クラスをBlobのサンプルに使用することはできません。

+0

エンドポイント(サーバ)からアンドロイドにブロブを送信するには、エンコードする必要がありますか? (Base64)、それともすでに処理されていますか? – learner

+0

@ learnerは提供URLを与えられているので、他の外部画像と同様に扱うことができます。この回答を見る[Android image fetching](http://stackoverflow.com/a/2909460/1522990) – panjiesw

関連する問題