Java 文件上传到AWS S3 Bucket[android studio]

Java 文件上传到AWS S3 Bucket[android studio],java,android,amazon-web-services,android-studio,amazon-s3,Java,Android,Amazon Web Services,Android Studio,Amazon S3,我正在尝试将文件从android studio上传到AWS S3 Bucket。我已经创建了一个新的AWS帐户。这似乎是验证/授权代码问题。有人能帮我找出这个问题的根本原因,以及如何解决这个问题吗 如果需要更多细节,请告诉我 谢谢 桶策略: { "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Pr

我正在尝试将文件从android studio上传到AWS S3 Bucket。我已经创建了一个新的AWS帐户。这似乎是验证/授权代码问题。有人能帮我找出这个问题的根本原因,以及如何解决这个问题吗

如果需要更多细节,请告诉我

谢谢

桶策略:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"

            ],
            "Resource": "arn:aws:s3:::mybucket/*"
        }
    ]
}
调试日志中的警告:

D/CognitoCachingCredentialsProvider﹕ Loading credentials from SharedPreferences
D/CognitoCachingCredentialsProvider﹕ No valid credentials found in SharedPreferences
I/AmazonHttpClient﹕ Unable to execute HTTP request: Read timed out
    java.net.SocketTimeoutException: Read timed out
            at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
            at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:674)
            at com.android.okio.Okio$2.read(Okio.java:113)
            at com.android.okio.RealBufferedSource.indexOf(RealBufferedSource.java:147)
            at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:94)
            at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:175)
            at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
            at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:616)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:379)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseMessage(HttpURLConnectionImpl.java:487)
            at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getResponseMessage(DelegatingHttpsURLConnection.java:109)
            at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseMessage(HttpsURLConnectionImpl.java:25)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:62)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:353)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:196)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4234)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1644)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:134)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:126)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:182)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:140)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:54)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
代码:

//变量值:
专用静态最终字符串AWS_ACCOUNT_ID=“078xxxxxx91”;
私有静态最终字符串COGNITO_POOL_ID=“eu-west-1:9xxxxx16-4xx2-4xxa-axx1-44cxxxxxxf5”;
私有静态最终字符串COGNITO\u ROLE\u UNAUTH=“arn:aws:iam::078xxxxxxx91:ROLE/COGNITO\u ABCUnauth\u ROLE”;
私有静态最终字符串BUCKET_NAME=“mybucket”;
私有void uploadImagesToServer(){
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
试一试{
AWSCredentialsProvider credProvider=null;
credProvider=getCredProvider(credProvider,getApplicationContext());
TransferManager TransferManager=新的TransferManager(credProvider);

对于(int i=0;i日志显示
请求ARN无效
。这是因为
COGNITO\u ROLE\u UNAUTH
是一个空字符串。请从IAM获取角色ARN,或从控制台复制示例代码

然后您会看到
未授权执行sts:AssumeRoleWithWebIdentity
异常。当凭据提供程序请求sts承担您为会话凭据指定的角色,但您的角色未设置为信任Cognito时,会发生这种情况

从其名称判断,该角色是由您创建的,而不是由Cognito在控制台中生成的。我相信您忘记了信任关系。转到IAM控制台,编辑该角色,向下滚动,然后单击“编辑信任关系”。确保您具有以下内容(用您的Cognito标识池id替换池id)

{
“版本”:“2012-10-17”,
“声明”:[
{
“Sid”:“,
“效果”:“允许”,
“委托人”:{
“联邦”:“cognito identity.amazonaws.com”
},
“行动”:“sts:假定身份”,
“条件”:{
“StringEquals”:{
cognito identity.amazonaws.com:aud:“us-east-1:
},
“ForAnyValue:StringLike”:{
“cognito identity.amazonaws.com:amr:“未经验证”
}
}
}
]
}

您好,谢谢您的评论。我尝试为COGNIT O_ROLE_UNAUTH字符串添加值,警告日志现在已更改为授权问题。我不确定是否需要输入“IAM用户ARN”值或“角色ARN”值。我尝试了这两种方法。但不确定我是否输入了正确的值。请在此提供帮助。谢谢。此身份验证错误是由于Bucket策略造成的吗?您是否启用了对身份池的未授权访问?在创建身份池时,默认情况下会禁用此功能。请在AWS控制台中检查您的身份池设置。谢谢Yangfan,“启用对未经身份验证的身份的访问”框已签入(可在编辑身份池->未经身份验证的身份设置中找到),问题仍然存在。您是否检查了角色的信任关系?请参阅我的答复。
// Variables Values:
private static final String AWS_ACCOUNT_ID = "078xxxxxxx91";
    private static final String COGNITO_POOL_ID = "eu-west-1:9xxxxx16-4xx2-4xxa-axx1-44cxxxxxxxf5";
    private static final String COGNITO_ROLE_UNAUTH = "arn:aws:iam::078xxxxxxx91:role/Cognito_ABCUnauth_Role";
    private static final String BUCKET_NAME = "mybucket";

   private void uploadImagesToServer() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    AWSCredentialsProvider credProvider = null;
                    credProvider = getCredProvider(credProvider, getApplicationContext());
                    TransferManager transferManager = new TransferManager(credProvider);
            for(int i=0; i<imagesPath.size(); i++) {
                File file = new File(imagesPath.get(i));
                String fileName = file.getName();
                Upload upload = transferManager.upload(BUCKET_NAME, fileName, file);                        
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();
}

public static AWSCredentialsProvider getCredProvider(AWSCredentialsProvider sCredProvider,
                                                     Context appContext) {
    if(sCredProvider == null) {
        sCredProvider = new CognitoCachingCredentialsProvider(
                appContext,
                AWS_ACCOUNT_ID, COGNITO_POOL_ID, COGNITO_ROLE_UNAUTH,
                null, Regions.EU_WEST_1);
        sCredProvider.refresh();
    }
    return sCredProvider;
}