Прямая загрузка из браузера на S3 с помощью Meteor, jQuery и AWS SDK
Я попал почти в каждый ресурс по этой теме, но все еще нуждаюсь в вашей помощи, чтобы сделать эту работу. Я хочу напрямую загружать файлы на мой S3 прямо из браузера в моем приложении Meteor. Для этого я предоставляю подписанный URL-адрес клиенту, как в этом упрощенном примере:
Meteor.methods({
requestUpload: function(filename) {
var fut = new Future();
new Fiber(function() {
var params = {
Bucket: MY_BUCKET,
Key: new Date().getTime() + "_" + filename
};
var surl = s3.getSignedUrl('putObject', params, function(err, surl) {
if (!err) {
console.log("signed url: " + surl);
fut.return(data);
} else {
console.log("Error signing url " + err);
fut.return();
}
});
}).run();
return fut.wait();
}
}
Затем клиент вызывает этот метод, получает подписанный URL-адрес, который выглядит следующим образом
https://mybucket.s3-eu-west-1.amazonaws.com/1382890365957_myfile.png?AWSAccessKeyId=AKBLABLA&Expires=1382891265&Signature=BLABLA
и пытается загрузить файл с запросом POST, используя jQuery, как в следующем фрагменте:
Template.form.events({
'submit form': function(e, t) {
e.preventDefault();
var fileInput = t.find("input[type=file]");
for (var i = 0; i < fileInput.files.length; i++) {
var file = fileInput.files[i];
Meteor.call("requestUpload", file.name, function(err, surl) {
if (!err) {
console.log("signed url: " + surl);
var reader = new FileReader();
reader.onload = function(event) {
// Here I am trying to upload, it fails
$.post(surl, reader.result, function(data, status) {
console.log("status: " + status);
console.log("data: " + data);
});
};
reader.readAsDataURL(file);
} else {
console.log(err);
}
});
}
}
});
Я хочу использовать JQuery, потому что я этоВозможно, это хороший способ охватить множество браузеров и версий браузеров. Я также проверил свою конфигурацию CORS для этого конкретного сегмента, это выглядит так:
*
POST
PUT
3000
*
Учетные данные, с которыми я настраиваю свой SDK на сервере, в порядке, у них есть права администратора, и я все время их использую для размещения и получения объектов в S3 с сервера. Кроме того, если я подписываю URL для вызова GET в личном файле, подписанный URL действителен. Возможно, я делаю что-то не так с почтовым звонком.
Любая помощь очень ценится!