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!

questionAnswers(3)

yourAnswerToTheQuestion