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
Vous devez vous connecter pour publier un commentaire.
Je crois que vous avez besoin pour passer la longueur du contenu dans l'en-tête comme documenté sur le S3 docs: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
Après avoir passé un peu de temps de travail sur le développement des actifs de S3, j'ai fini à l'aide de la AwsSum de la bibliothèque, avec d'excellents résultats de production:
https://github.com/awssum/awssum-amazon-s3/
(Voir la documentation sur la configuration de vos informations d'identification AWS)
Exemple:
Mise à JOUR
Donc, si vous utilisez quelque chose comme de l'Exprimer ou de se Connecter qui sont construites sur les Formidable, alors vous n'avez pas accès au fichier de flux aussi Redoutable écrit les fichiers sur le disque. Donc, en fonction de comment vous le télécharger sur le côté client, l'image sera soit dans
req.body
oureq.files
. Dans mon cas, j'utilise Express et sur le côté client, je poste d'autres données, afin que l'image a son propre paramètre et est accessible en tant quereq.files.img_data
. Cependant d'accès, que les param est ce que vous transmettez en tant queimg_path
dans l'exemple ci-dessus.Si vous devez /voulez diffuser le fichier qui est plus difficile, mais possible et si vous n'êtes pas la manipulation de l'image que vous voudrez peut-être chercher à prendre de la SCRO approche et de téléchargement direct de S3 comme expliqué ici: Flux que l'utilisateur télécharge directement à Amazon s3