要在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;
}
}
}
答案 0 :(得分:1)
堆栈跟踪显示Access Denied
。这通常意味着您的凭据无权执行某些操作。请检查凭据的访问策略。仅供参考,该特定操作需要s3:PutObjectAcl
许可。有关访问策略的详细信息,请参阅http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html。