我是否可以使用第3级api授予对AWS S3中保​​存的对象的访问权限?

时间:2015-10-26 16:31:19

标签: android amazon-web-services amazon-s3 acl

要在S3存储桶中上传文件,您可以使用第3级API:

TransferUtility transferUtility = AWSUtils.getTransferUtility(App.getInstance());
TransferObserver observer = transferUtility.upload(AWSUtils.getBucketName(), AWSUtils.getUserPreferredPicturePath(), fileToUpload);

现在,如果我想对此文件进行大访问(又称ACL),我该怎么办?

AWSUtils.getS3Client(App.getInstance()).setObjectAcl(AWSUtils.getBucketName(), AWSUtils.getUserPreferredPicturePath(), CannedAccessControlList.AuthenticatedRead);

这对我不起作用......

编辑:

确定Async。我的堆栈跟踪是:

Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 7A391FA126C83C0A), S3 Extended Request ID: 47JoAm2dOlNH+eX9fZx+nQiAM1WmPI431+IE99JCZKh90Kr+q1u5T8sDWzhLASJZ

我的完整(Q& D)代码如下:

public class SaveProfilePictureOnAWSS3Error extends AsyncTask<String, Void, Void> {
    @Override
    public Void doInBackground(String... params) {

        try {

            String picture_url = params[0];

            File fileToUpload = new File(picture_url);

            TransferUtility transferUtility = AWSUtils.getTransferUtility(getInstance());
            TransferObserver observer = transferUtility.upload(AWSUtils.getBucketName(), "test/" + AWSUtils.getUserPreferredPicturePath(), fileToUpload);


            observer.setTransferListener(new TransferListener() {

                @Override
                public void onStateChanged(int id, TransferState state) {

                    if (state.equals(TransferState.COMPLETED)) {
                        new  updateACL().execute();
                    }
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                    int percentage = (int) (bytesCurrent / bytesTotal * 100);
                    //Display percentage transfered to user
                }

                @Override
                public void onError(int id, Exception ex) {
                    // do something
                    new MessageToDisplayEvent(ex.getMessage(), true);
                }
            });

        } catch (Exception e) {
            EventBus.getDefault().post(new MessageToDisplayEvent(e.getMessage(), true));
        }

        return null;
    }

    public class updateACL extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... params) {
            AWSUtils.getS3Client(MilleZimU.getInstance()).setObjectAcl(AWSUtils.getBucketName(), "test/" + AWSUtils.getUserPreferredPicturePath(), CannedAccessControlList.AuthenticatedRead);
            return null;
        }
    }

}

1 个答案:

答案 0 :(得分:1)

堆栈跟踪显示Access Denied。这通常意味着您的凭据无权执行某些操作。请检查凭据的访问策略。仅供参考,该特定操作需要s3:PutObjectAcl许可。有关访问策略的详细信息,请参阅http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html