2016-04-04 12 views
3

私のAppEngineプロジェクトには、再開可能URLをAndroidクライアントに送信するAPIメソッドがあり、再開可能URLを使用して画像をアップロードします。オブジェクトが存在するかどうかGoogleのクラウドストレージチェック(App Engine Java)

署名されたURLを作成して返す別のAPIメソッドがあります。署名付きURLには、Google Cloud Storageバケットとオブジェクト名を指定する必要があります。しかし、そのオブジェクトは存在しないかもしれません。その場合、署名されたURLはもちろん動作しません。

Signed URLを発行する前に、オブジェクトが(バケット内に)App Engineバックエンドに存在するかどうかをすばやく確認するにはどうすればよいですか。

EDIT:私のApp Engineプロジェクトは、Cloud Endpointsプロジェクトです。

+0

それが消えましたか? :)あなたがオブジェクトの名前を知っていれば、あなた自身でそれを削除し、あなたのデータベースを更新するのを忘れていない限り、それはまだそこにあるはずです。 –

+0

@AndreiVolgin私はGCSの '' profile_photo_user_ "+ username'のように見える私のモバイルアプリのユーザーのプロフィール写真を保存します。ただし、新しいユーザーがまだ写真をアップロードしていない可能性があります。いずれにせよ、私は彼らのプロフィール写真を手に入れる。したがって、署名されたURLはまだ存在していないイメージを指している可能性があります。あなたのコメントが私はプロファイルの写真を格納/検索のこの戦略を再考する必要がありますように思えます:)私はちょうどあなたがobjの名前のデータストアにエントリを書き込むために再開可能なURLを介して画像をアップロードするのを知る方法がない例。 – Micro

+0

プロフィール写真と同じくらい小さいものに対しては再開可能なアップロードが必要ですか?再開可能アップロードは、多くのMBまたはGB単位で測定されたファイルです。小さなファイルの方が処理速度が遅くなります。代わりに、 'getUploadUrl'メソッドを使用すると、アップロードが競合した後にファイルの詳細をサーバーにコールバックし、その時点でデータベースを更新することができます(例えば、" photo available "を" true " )。 –

答えて

1

getMetadataを呼び出して、オブジェクトをダウンロードせずに存在するかどうかを確認できます。

GcsService fileService = GcsServiceFactory.createGcsService(); 
GcsFilename file = new GcsFilename(bucket, object); 
fileService.getMetadata(file); 

代わりに、(必要に応じて、オブジェクトの名前を等しくすることができる)指定された接頭辞で始まるバケットバケット内のすべてのオブジェクトまたはすべてのオブジェクトを一覧表示することができます。

UPDATE:

これは私が私のクライアントにuploadURLを送信する方法である:

@Override 
public String getUploadUrl() throws LoginException, VersionException { 
    // Verify that call is from a registered user and with proper headers 

    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
    String callbackUrl = "/blob"; 
    return blobstoreService.createUploadUrl(callbackUrl, 
      UploadOptions.Builder.withGoogleStorageBucketName("myBucket)); 
} 
+1

'getMetadata'はどこにありますか?私はこのような 'App.Get getObject = storage.objects()。get(" bucketName "、objName);のようなApp Engineでオブジェクトを取得できますが、' getObject.getMetadata' ..のようなものは表示されません。 – Micro

+1

App Engine用のクライアントライブラリを使用していません。私は答えにスニペットを追加します。あなたは、Cloud Storageへの非GAEアクセスに適したAPIを使用しています。また、非GAEアクセスの場合でも、使用しているコードの上に構築されているが、はるかに使いやすい新しいGcloud APIを使用する方が良いです。 –

+0

このAPIを使用する必要があります:https://cloud.google.com/appengine/docs/java/googlecloudstorageclient/using-cloud-storageこれは特にApp Engine用に設計されており、はるかに使いやすくなっています。 –

関連する問題