2016-09-16 4 views
2

Я пытаюсь загрузить данные в ведро s3 из браузера. Я создал предварительно подписанный URL-адрес, но получаю запрещенный ответ 403.S3 Загрузить изображение с заранее подписанным URL из браузера

Мой код сервера

const s3 = new AWS.S3({ 
    accessKeyId: settings.resourceBucketKey, 
    secretAccessKey: settings.resourceBucketSecret, 
    region: 'eu-west-1' 
}) 

const params = { 
    Bucket: 'my-bucket', 
    Key: 'photo.png', 
    ContentType: 'image/png', 
    ACL: 'authenticated-read', 
} 

const url = s3.getSignedUrl('putObject', params) 

console.log(url) 

Мой клиент-код (используя сгенерированный URL)

const input = $('#myinput') 

     input.on('change', (res) => { 
     var theFormFile = $('#myinput').get()[0].files[0]; 

     $.ajax({ 
      url: url, 
      type: 'PUT', 
      contentType: 'image/png', 
      processData: false, 
      data: theFormFile, 
     }).success(function(){ 
      alert('success') 
     }) 
     }, false) 

Я поставил CORS на на ведро:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Но Я по-прежнему получаю запрет на ответ. Изображение, которое я пытаюсь загрузить, называется «photo.png». Я что-то упустил?

ответ

1

Создатель (вы) из предварительно подписанного URL должен иметь разрешения на доступ к ведро S3 для загрузки файла. Это более красноречиво описано в S3 documentation:

Предварительно подписанный URL дает вам доступ к объекту, определенному в URL, при условии, что создатель предварительно подписанное URL имеет разрешение на доступ к этому объекту , То есть, если вы получаете предварительно подписанный URL-адрес для загрузки объекта , вы можете загрузить этот объект только в том случае, если создатель предварительно подписанного URL имеет необходимые разрешения для загрузки этого объекта.

Убедитесь, что пользователь IAM, создающий предварительно подписанный URL-адрес, имеет необходимые разрешения.

+0

Спасибо, что это была именно эта проблема! – wazzaday

0

Полная реализация получения подписанного URL из браузера - наслаждайтесь!

<body> 
    <img height="200" width="200"> 
    <script> 

    var mimes = { 
     'jpeg': 'data:image/jpeg;base64,' 
    }; 

     AWS.config.update({ 
      signatureVersion: 'v4', 
      region: 'us-east-1', 
      accessKeyId: '', 
      secretAccessKey: '' 
     }); 

     var bucket = new AWS.S3({params: {Bucket: 'xxxx'}}); 

     function encode(data) 
     { 
      var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },''); 
      return btoa(str).replace(/.{76}(?=.)/g,'$&\n'); 
     } 

     function getUrlByFileName(fileName,mimeType) { 
      return new Promise(
       function (resolve, reject) { 
        bucket.getObject({Key: fileName}, function (err, file) { 
         var result = mimeType + encode(file.Body); 
         resolve(result) 
        }); 
       } 
     ); 
     } 

     function openInNewTab(url) { 
      var redirectWindow = window.open(url, '_blank'); 
      redirectWindow.location; 
     } 

     getUrlByFileName('sprites.png', mimes.jpeg).then(function(data) { 
      //openInNewTab(data); 
      document.querySelector('img').src = data; 
     }); 

    </script> 
</body> 
+0

не забудьте добавить -

Смежные вопросы