Comment faire d’une socket un stream? Pour connecter la réponse https à S3 après imagemagick

Je suis nœud et programmeur en général, et j’ai vraiment du mal avec ça …

Je veux prendre une réponse https, la redimensionner avec graphicsmagick et l’envoyer à mon compartiment amazon S3.

Il semble que le https res soit un object IncomingMessage (je ne trouve aucune information à ce sujet) et que la sortie standard de graphicsmagick est un Socket.

La chose étrange est que je peux utiliser pipe et envoyer les deux à un writeStream avec un chemin local, et res et stdout créent une belle nouvelle image redimensionnée.

Et je peux même envoyer des res au S3 (en utilisant knox) et ça marche.

Mais stdout ne veut pas aller au S3: – /

Toute aide serait appréciée!

https.get(JSON.parse(queryResponse).data.url,function(res){ var headers = { 'Content-Length': res.headers['content-length'] , 'Content-Type': res.headers['content-type'] } graphicsmagick(res) .resize('50','50') .stream(function (err, stdout, stderr) { req = S3Client.putStream(stdout,'new_resized.jpg', headers, function(err, res){ }) req.end() }) }) 

knox – pour la connexion à S3 – https://github.com/LearnBoost/knox graphicsmagick – pour la manipulation d’images – https://github.com/aheckmann/gm

Le problème était lié au fait qu’Amazon a besoin de connaître la longueur du contenu avant de commencer (merci à DarkGlass).

Cependant, mes images étant relativement petites, la mise en mémoire tampon a été privilégiée par rapport à MultiPartUpload.

Ma solution:

 https.get(JSON.parse(queryResponse).data.url,function(res){ graphicsmagick(res) .resize('50','50') .stream(function (err, stdout, stderr) { ws. = fs.createWriteStream(output) i = [] stdout.on('data',function(data){ i.push(data) }) stdout.on('close',function(){ var image = Buffer.concat(i) var req = S3Client.put("new-file-name",{ 'Content-Length' : image.length ,'Content-Type' : res.headers['content-type'] }) req.on('response',function(res){ //prepare 'response' callback from S3 if (200 == res.statusCode) console.log('it worked') }) req.end(image) //send the content of the file and an end }) }) }) 

Vous semblez définir Content-Length à partir de l’image d’origine et non de l’image redimensionnée

Peut-être que cela aide

obtenir la longueur du contenu d’un stream

https://npmjs.org/package/knox-mpu

Vous ne devriez pas faire req.end() ici. En faisant cela, vous fermez le stream sur S3 avant qu’il ait eu le temps d’envoyer les données d’image. Il se end automatiquement lorsque toutes les données de l’image auront été envoyées.