Я стараюсь следовать этому руководству по загрузке файлов на 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
});
});
});
Я думаю, что на JSON вы отправляете обратно из 'метода s3.getSignedUrl' URL-адрес должен включать в себя ведро, так что это должно быть что-то вроде: ' URL: «https: // [ведро] .s3.amazonaws .com/+ ... ' – fitims
Привет @fitims Я изменил свой ведро, но все равно получаю те же запросы и ошибки – cphill
Фактически установлено, что проблема связана с политикой, применяемой к пользователю с помощью ключа auth. Не имеет никакого отношения к коду. – cphill