2017-09-01 1 views
0

Je dois écrire un code de téléchargement en utilisant NodeJS avec swagger. L'exigence consiste à créer deux fichiers redimensionnés et à les envoyer à AWS S3. Je peux le faire par:NodeJS: Créer un flux de fichier redimensionné à partir d'un autre flux à la volée

  • Enregistrez le fichier entrant sur le disque.
  • Ouvrez le fichier d'origine, redimensionnez (version 1) et enregistrez-le sur le disque.
  • Ouvrez à nouveau le fichier d'origine, redimensionnez-le (version 2) et enregistrez-le sur le disque .
  • Créer stream1 de version1
  • Créer stream2 de version2
  • Envoyer les flux à S3
  • Supprimer les fichiers résiduels

Ce que je cherche est de créer un fichier redimensionnée de flux entrant sur le voler et les envoyer à S3 sans rien sauvegarder sur le disque. Est-ce possible? Existe-t-il un module pouvant créer un flux d'image redimensionné à partir d'un autre flux?

je peux obtenir le flux à partir du fichier téléchargé comme:

var _originalStream = new Buffer(req.swagger.params.uploadedFile.value.buffer, 'binary'); 

Ensuite, je dois utiliser le flux ci-dessus et de créer deux cours d'eau de celui-ci.

Répondre

0

Vous pouvez utiliser sharp pour que:

const sharp = require('sharp'); 
const fs = require('fs'); 

let pipeline = sharp(); 

// temporary files (see text) 
let version1 = fs.createWriteStream('output1.jpg'); 
let version2 = fs.createWriteStream('output2.jpg'); 

pipeline.clone().resize(800, 600).pipe(version1); 
pipeline.clone().resize(320, 240).pipe(version2); 

_originalStream.pipe(pipeline).on('finish',() => { 
    console.log('done'); 
    ...upload files to S3 and remove temporary files... 
}); 

Comme vous pouvez le voir, il peut créer deux sorties redimensionnée (ou plus) directement, en utilisant .clone(). De plus, au lieu d'utiliser des fichiers temporaires, vous pouvez probablement utiliser des flux S3 pour télécharger les fichiers directement (je ne connais pas suffisamment S3 pour fournir un exemple de code, mais cela ne devrait pas être trop difficile). En aparté: _originalStream dans votre exemple n'est pas un flux, c'est Buffer. Vous pouvez également utiliser ces entrées avec sharp. Cela fonctionnera probablement:

let pipeline = sharp(req.swagger.params.uploadedFile.value.buffer); 

(dans ce cas, vous n'utilisez pas _originalStream.pipe())