0

Android で 1 つのファイルを s3 バケットにアップロードする必要があります。Cognito ユーザープールでアップロードを認証したいと考えています。

これを行う標準的な方法は、Amazon Amplify SDK の Storage API を使用することです。

問題は、アップロードの進行状況を報告する必要があることです。Amplify Storage では、Android で進行状況を監視するリスナーを設定できません。

それは私を使用する必要性に私を連れて行きますTransferUtility

Cognito と TransferUtility を使用してアップロード操作を認証するにはどうすればよいですか?

現時点で私はやっています:

            val credentials = CognitoCachingCredentialsProvider(
                context,
                "eu-west-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
                Regions.US_WEST_1)

            val s3Client = AmazonS3Client(credentials, Region.getRegion(Regions.US_WEST_1))

            val transferUtility = TransferUtility.builder()
                .context(context)
                .s3Client(s3Client)
                .build()

しかし、私は403を取得しています:

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXXXXX), S3 Extended Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx=

StorageAPI が よりも優先されているようTransferUtilityで、Cognito ユーザープールまたはユーザー ID に関係することはすべて Amplitude Storage で行われているため、これに関するドキュメントを入手するのに本当に苦労しています。

4

1 に答える 1

0

私はついにこれを行ういくつかのドキュメントを見つけました。基本的には、をビルドしてAWSMobileClientの実装として使用します。AWSConfigurationTransferUtility


        TransferUtility transferUtility =
            TransferUtility.builder()
                .context(getApplicationContext())
                .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                .s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider()))
                .build();

        TransferObserver uploadObserver =
            transferUtility.upload(
                "s3Folder/s3Key.txt",
                new File("/path/to/file/localFile.txt"));

https://github.com/awsdocs/aws-mobile-developer-guide/blob/master/doc_source/how-to-transfer-files-with-transfer-utility.rst

また、HTTP 403 を受信せずにこの作業を行うために把握しなければならなかった 2 つの注意事項があります。

  1. に必要な情報を追加するawsconfiguration.json
{
  "IdentityManager": {
    "Default": {}
  },
  "CognitoUserPool": {
    "Default": {
      "PoolId": "region_XXXXXXX",
      "AppClientId": "XXXXXXXXXXXXXXX",
      "Region": "XXXXX"
    }
  },
  "CredentialsProvider": {
    "CognitoIdentity": {
      "Default": {
        "PoolId": "XXXXX:XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "Region": "XXXXXX"
      }
    }
  },
  "S3TransferUtility": {
    "Default": {
      "Bucket": "XXXXXXXXXXXXXXXXXXX-data-bucket",
      "Region": "XXXXXX"
    }
  }
}

CredentialsProvider.CognitoIdentity.Default.PoolIdと同じではないことに 注意してくださいCognitoUserPool.Default.PoolId!

  1. keyサーバー側の構成に応じて、必要に応じて、アップロードを実行するときに「プライベート」/「パブリック」プレフィックスを先頭に追加します。
于 2019-12-17T11:06:43.033 に答える