Bezpośrednie przesyłanie do przeglądarki do S3 za pomocą Meteor, jQuery i AWS SDK
Dotarłem do prawie każdego zasobu na ten temat, ale nadal potrzebuję twojej pomocy, aby ta praca działała. Chcę bezpośrednio przesyłać pliki do mojego S3 bezpośrednio z przeglądarki w mojej aplikacji Meteor. W tym celu dostarczam klientowi podpisany adres URL, tak jak w tym uproszczonym przykładzie:
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();
}
}
Następnie klient wywołuje tę metodę, uzyskuje podpisany adres URL, który wygląda tak
https://mybucket.s3-eu-west-1.amazonaws.com/1382890365957_myfile.png?AWSAccessKeyId=AKBLABLA&Expires=1382891265&Signature=BLABLA
i próbuje przesłać plik z żądaniem POST za pomocą jQuery, tak jak w tym fragmencie:
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);
}
});
}
}
});
Chcę używać jQuery, ponieważ moim zdaniem jest to dobry sposób na pokrycie wielu przeglądarek i wersji przeglądarek. Sprawdziłem również moją konfigurację CORS dla tego konkretnego wiadra, wygląda to tak:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Poświadczenia, które konfiguruję mój zestaw SDK na serwerze, są prawidłowe, mają uprawnienia administratora i używam ich cały czas do umieszczania i pobierania obiektów w S3 z serwera. Ponadto, jeśli podpiszę adres URL dla wywołania GET w prywatnym pliku, podpisany adres URL jest ważny. Prawdopodobnie robię coś złego z połączeniem pocztowym.
Każda pomoc jest bardzo ceniona!