2015-10-26 2 views
0

Чтобы загрузить файл в ведре 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; 
     } 
    } 

} 
+0

Что не работает? Не могли бы вы предоставить более подробную информацию, например, трассировку стека и т. Д.? Загрузка является асинхронной. Пожалуйста, убедитесь, что это сделано до того, как вы оперируете, скажем, настройку ACL. – Yangfan

+0

@Yangfan см. Мое обновление. – Anthony

ответ

1

StackTrace показывает Access Denied. Обычно это означает, что ваши учетные данные не имеют разрешения на выполнение определенных операций. Проверьте политику доступа к учетным данным. FYI, для этой конкретной операции требуется разрешение s3:PutObjectAcl. Дополнительные сведения о политике доступа см. В разделе http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html.

+0

как владелец, разве я не мог изменить разрешение, как определено в консоли («tick edit Permission»)? – Anthony

+0

У меня нет полного контекста, поэтому я не могу сказать, где проблема. Однако это определенно проблема разрешения. – Yangfan

+0

Ведро - это свежие новости, поэтому у меня есть стандартное разрешение по умолчанию для владельца ведра (List | Update, Delete | View Permission | Edit Permission). Делает это недостаточно, чтобы все? – Anthony