stream en cours de téléchargement une image redimensionnée GM sur s3 avec aws-sdk

Donc, ce que je veux faire est de diffuser une image à partir d’une URL, de la traiter avec graphicsmagick et de la transférer en continu sur s3. Je ne fais pas que ça marche.

la diffusion de l’image traitée sur le disque local (à l’aide de fs.createWriteStream) fonctionne sans problème.

Lorsque je mets en mémoire tampon mon stream, l’image finale dans s3 a au moins la taille attendue (ko-sage), mais je ne peux pas ouvrir cette image.

thats ma progression actuelle:

var request = require('request'); var gm = require("gm"); var AWS = require('aws-sdk'); var mime = require('mime'); var s3 = new AWS.S3(); gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") .resize("100^", "100^") .stream(function(err, stdout, stderr) { var str = ''; stdout.on('data', function(data) { str += data; }); stdout.on('end', function(data) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: new Buffer(str, 'binary'), // thats where im probably wrong ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); }); }); 

J’ai essayé quelques trucs comme créer un fichier filewritestream et filereadstream, mais je pense qu’il devrait y avoir une solution plus propre et plus agréable à ce problème …

EDIT: la première chose que j’ai essayée était de régler le corps sur la sortie standard (la réponse suggérée de @AndyD):

 var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: stdout, ContentType: mime.lookup("my-image.jpg") }; 

mais cela retourne l’erreur suivante:

 Cannot determine length of [object Object]' 

EDIT2:

  • nodeversion: 0.8.6 (j’ai aussi essayé 0.8.22 et 0.10.0)
  • aws-sdk: 0.9.7-pre.8 (installé aujourd’hui)

l’erreur complète:

 { [Error: Cannot determine length of [object Object]] message: 'Cannot determine length of [object Object]', object: { _handle: { writeQueueSize: 0, owner: [Circular], onread: [Function: onread] }, _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroyed: false, errorEmitted: false, bytesRead: 0, _bytesDispatched: 0, allowHalfOpen: undefined, writable: false, readable: true, _paused: false, _events: { close: [Function], error: [Function: handlerr] } }, name: 'Error' } 

vous n’avez pas besoin de lire le stream vous-même (dans votre cas, vous semblez convertir une chaîne binary en chaîne et inversement à cause de var str = ”, puis append des données qui constituent un tampon binary, etc.

Essayez de laisser putObject diriger le stream de la manière suivante:

 gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg") .resize("100^", "100^") .stream(function(err, stdout, stderr) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: stdout ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); }); }); 

Voir ces notes de publication pour plus d’informations.

Si le streaming / pipe ne fonctionne pas, alors quelque chose comme ceci pourrait charger tout en mémoire et ensuite télécharger. Vous êtes limité à 4Mb je pense dans ce cas.

  var buf = new Buffer(''); stdout.on('data', function(data) { buf = Buffer.concat([buf, data]); }); stdout.on('end', function(data) { var data = { Bucket: "my-bucket", Key: "my-image.jpg", Body: buf, ContentType: mime.lookup("my-image.jpg") }; s3.client.putObject(data, function(err, res) { console.log("done"); }); });