2016-06-13 4 views
0

Я стараюсь следовать этому руководству по загрузке файлов на Amazon S3 с помощью NodeJS и получил зависание на ошибке, которая возникает на клиентской стороне кода, но я уверен, что это часть моего маршрута. Ошибка 404, которая появляется, находится в запросе xhr.send() на сервере в функции sign_request. Информация из моего файла, которая зарегистрирована в GET, верна file:138 GET http://localhost:3000/sign?file_name=gtm-value.png&file_type=image/png 404 (Not Found), что заставляет меня думать, что это связано с моей настройкой маршрута.AWS S3 & NodeJS - ошибка xhr

вид:

<!DOCTYPE html> 
    <head> 
     {{> app/app-head}} 
    </head> 
    <body> 
     {{> app/app-navigation}} 
     <div class="container"> 
      <div class="col-md-12"> 
      <form action="/create" method="post"> 
       <input type="file" name="fileAttachment" id="image"> 
        <img id="preview"> 
<button type="submit" id="button">Create Image</button> 
      </form> 
     </div> 
     <script type="text/javascript"> 
      function upload(file, signed_request, url, done) { 
       var xhr = new XMLHttpRequest(); 
       xhr.open("PUT", signed_request); 
       xhr.setRequestHeader('x-amz-acl', 'public-read'); 
       xhr.onload = function() { 
       if (xhr.status === 200) { 
        done() 
       }; 
      }; 
      xhr.send(file); 
      } 

     function sign_request(file, done) { 
      var xhr = new XMLHttpRequest(); 
      xhr.open("GET", "/sign?file_name=" + file.name + "&file_type=" + file.type); 
      xhr.onreadystatechange = function() { 
       if(xhr.readyState === 4 && xhr.status === 200) { 
        var response = JSON.parse(xhr.responseText); 
        done(response); 
       } 
      }; 
      xhr.send(); 
     }; 

     document.getElementById("image").onchange = function() { 
      var file = document.getElementById("image").files[0] 
      if (!file) return 
       sign_request(file, function(response) { 
        upload(file, response.signed_request, response.url, function() { 
         document.getElementById("preview").src = response.url 
        }); 
       }); 
     }; 
     </script> 

маршрут:

var aws = require('aws-sdk'); 

appRoutes.get('/sign', function(req, res){ 
    aws.config.update({accessKeyId: config.awsAccessKeyId, secretAccessKey: config.awsSecretAccessKey}); 

    var s3 = new aws.S3(); 
    var options = { 
     Bucket: config.awsBucket, 
     Key: req.query.file_name, 
     Expires: 60, 
     ContentType: req.query.file_type, 
     ACL: 'public-read' 
    } 

    s3.getSignedUrl('putObject', options, function(err, data){ 
     if(err) return res.send('Error with S3') 

     res.json({ 
      signed_request: data, 
      url: 'https://s3.amazonaws.com/' + config.awsBucket + '/' + req.query.file_name 
     }); 
    }); 
}); 
+0

Я думаю, что на JSON вы отправляете обратно из 'метода s3.getSignedUrl' URL-адрес должен включать в себя ведро, так что это должно быть что-то вроде: ' URL: «https: // [ведро] .s3.amazonaws .com/+ ... ' – fitims

+0

Привет @fitims Я изменил свой ведро, но все равно получаю те же запросы и ошибки – cphill

+0

Фактически установлено, что проблема связана с политикой, применяемой к пользователю с помощью ключа auth. Не имеет никакого отношения к коду. – cphill

ответ

0

Проблема была связана с кодом и проблема с правами доступа, предоставляемые пользователю с помощью ключа AUTH. После предоставления пользователю политики AdministrativeAccess проблема была решена.

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