Pousser des données binaires vers Amazon S3 en utilisant Node.js

Je suis en train de prendre une image et de le transférer à un compartiment Amazon S3 à l'aide de Node.js. En fin de compte, je veux être en mesure de pousser à l'image de S3, et ensuite être capable d'accéder à la S3 URL et de voir l'image dans un navigateur. Je suis à l'aide d'une boucle de requête pour faire une requête HTTP POST avec l'image que le corps.

curl -kvX POST --data-binary "@test.jpg" 'http://localhost:3031/upload/image'

Puis sur la Node.js côté, je fais ceci:

exports.pushImage = function(req, res) {
    var image = new Buffer(req.body);
    var s3bucket = new AWS.S3();
    s3bucket.createBucket(function() {
        var params = {Bucket: 'My/bucket', Key: 'test.jpg', Body: image};
        //Put the object into the bucket.
        s3bucket.putObject(params, function(err) {
            if (err) {
                res.writeHead(403, {'Content-Type':'text/plain'});
                res.write("Error uploading data");
                res.end()
            } else {
                res.writeHead(200, {'Content-Type':'text/plain'});
                res.write("Success");
                res.end()
            }
        });
    });
};

Mon fichier est de 0 octets, comme illustré sur Amazon S3. Comment puis-je faire pour que je puisse l'utiliser Node.js pour pousser le fichier binaire jusqu'à S3? Ce que je fais mal avec des données binaires et les tampons?

Mise à JOUR:

J'ai trouvé ce que je devais faire. La boucle de la requête est la première chose qui doit être changé. C'est le travail:

curl -kvX POST -F foobar=@my_image_name.jpg 'http://localhost:3031/upload/image'

Ensuite, j'ai ajouté une ligne pour convertir à un Ruisseau. C'est le code de travail:

exports.pushImage = function(req, res) {
    var image = new Buffer(req.body);
    var s3bucket = new AWS.S3();
    s3bucket.createBucket(function() {
        var bodyStream = fs.createReadStream(req.files.foobar.path);
        var params = {Bucket: 'My/bucket', Key: 'test.jpg', Body: bodyStream};
        //Put the object into the bucket.
        s3bucket.putObject(params, function(err) {
            if (err) {
                res.writeHead(403, {'Content-Type':'text/plain'});
                res.write("Error uploading data");
                res.end()
            } else {
                res.writeHead(200, {'Content-Type':'text/plain'});
                res.write("Success");
                res.end()
            }
        });
    });
};

Donc, pour télécharger un fichier à une API d'extrémité (à l'aide de Node.js et Express) et avoir l'API de pousser ce fichier à Amazon S3, vous devez d'abord effectuer une requête POST avec le champ "fichiers" peuplée. Le fichier se termine sur l'API côté, où il réside probablement dans certains répertoire tmp. Amazon S3 putObject méthode nécessite un Flux, alors vous avez besoin pour créer un flux de lectures en donnant le 'fs' module le chemin où le fichier téléchargé existe.

Je ne sais pas si c'est la bonne façon de télécharger des données, mais il fonctionne. Personne ne sait si il existe un moyen pour publier des données binaires à l'intérieur du corps de la requête et avoir l'API de l'envoyer à S3? Je ne sais pas trop quelle est la différence entre une partie multi-upload vs un POSTE standard pour le corps.

source d'informationauteur Jack