2

Google ストレージ API を使用して、GAE にデプロイされたアプリから画像を保持および取得しています。画像を正常に取得しましたが、永続化に関しては、詳細にエラー 400 が表示されます。

400 OK
{
    "code" : 400,
    "errors" : [ {
        "domain" : "global",
        "message" : "Required",
        "reason" : "required"
     }],
     "message" : "Required"
}

この情報に基づいて、必要ないかもしれないと思ったので、なしで試しました。appspot の URL を追加すると、Google クラウド ストレージと通信しているときに次のようになりました。

400 OK
{
    "code" : 400,
    "errors" : [ {
        "domain" : "global",
        "message" : "Required",
        "reason" : "required"
     }, {
        "domain" : "global",
        "message" : "Could not find domain \"mydomain.appspot.com\".",
        "reason" : "invalid"
     } ],
     "message" : "Required"
}

次の手順に従いました。

  1. Google Cloud Service への JSON API アクセスをオンにしました
  2. サービス アカウントを作成しました
  3. p12ファイルをダウンロードしました
  4. ファイルをエンコードしないようにmavenを構成しました
  5. ストレージ サービス API を含めるように構成された Maven
  6. サービス アカウントのメール アドレスをサービス アカウントとして使用して GoogleCredential を作成し、StorageScopes.DEVSTORAGE_FULL_CONTROL をスコープに追加して、秘密鍵ファイルにリンクしました (p12)
  7. 上記の資格情報、http トランスポートなどを使用して Storage オブジェクトをインスタンス化した

次のように StorageObject オブジェクトに設定される ObjectAccessControl オブジェクトのリストを使用しています。

...
//email from the service account client id configuration in the google cloud console
myAclList.add(new ObjectAccessControl()
            .setEntity("user-" + settings.getEmail()).setRole("OWNER")); 
//confused about what domain I should use; tried none, 
myAclList.add(new ObjectAccessControl()
            .setEntity("domain-" + settings.getDomain())
            .setRole("READER"));
StorageObject objectMetadata = new StorageObject()
            .setName("blahblah")
            .setAcl(myAclList)
            .setContentDisposition("attachment");
Storage.Objects.Insert insertObject = storage.objects()
            .insert(settings.getBucket(), objectMetadata, mediaContent);
insertObject.execute();  //400 error happens here
...

ドメインに対して正確に何を送信する必要がありますか? おそらくコンソールで何かを設定していませんか?私はアイデアがありません。

ご提案いただきありがとうございます。

編集: google-api-services-storage jar の v1beta2-rev2-1.15.0-rc バージョンを使用しています。

4

1 に答える 1

1

「ドメイン \"mydomain.appspot.com\" が見つかりませんでした」と表示される理由。「domain-」プレフィックスは、appengine ドメイン名ではなく、Google Apps for Business ドメイン内のすべてのアカウントを参照するということです。たとえば、fakecompany.com という会社で Google Apps を使用していて、fakecompany.com の下のすべてのアカウントにバケットへの読み取りアクセスを許可したい場合、「domain-fakecompany.com」を指定して、そのようなすべてを参照できます。アカウント。

mydomain.appspot.com は appengine のドメイン名であり、Google Apps for Business ドメインではないため、そのようなエラーが発生すると思います。

更新: 指摘する価値のある別の誤解がありました。サービス アカウントは、所有するバケットに新しいオブジェクトを挿入する権限を必ずしも持っているわけではありません。バケットに対して明示的な WRITE 以上の権限があることを確認してください。または、デフォルトのバケット ACL を使用している場合は、少なくともプロジェクトの「編集者」であることを確認してください。

最後に、オブジェクトを挿入するときに、バケット名とオブジェクト名が存在し、null でないことを確認してください。これは驚くほど簡単に発生する問題であり、表示されるエラー メッセージが常にこれを明確にしているわけではありません。

于 2013-07-31T18:55:54.647 に答える