Чтобы загрузить файл в ведре S3, вы можете использовать 3-го уровня API как:Могу ли я предоставить право доступа к объекту, сохраненному в AWS S3, с помощью api 3-го уровня?
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);
Это не работает для меня ...
EDIT:
Ok для Async. Мой StackTrace является:
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;
}
}
}
Что не работает? Не могли бы вы предоставить более подробную информацию, например, трассировку стека и т. Д.? Загрузка является асинхронной. Пожалуйста, убедитесь, что это сделано до того, как вы оперируете, скажем, настройку ACL. – Yangfan
@Yangfan см. Мое обновление. – Anthony