2014-06-05 10 views
8

Sto usando SailsJS (beta). Sto cercando di trovare un modo per utilizzare graphicsmagick per fare lo stream analizzato da Skipper in SailsJS-beta per ridimensionare l'immagine prima di chiamare la funzione Skipper req.file('inputName').upload().Skipper in SailsJS (beta) ridimensionamento dell'immagine prima del caricamento

Il mio obiettivo è prendere la mia grande immagine originale e ridimensionarla prima di caricarla. Le vele beta hanno introdotto il parser di file di Skipper che sono scarsamente documentati (almeno non lo capisco). Per favore aiutami a capire come ridimensionare l'immagine prima del caricamento.

questo funziona (codice nella mia azione di controllo):

req.file('fileName').upload('storedImage.png', function(err, files){ 
    // File is now uploaded to storedImage.png 
}); 

Quello che voglio è qualcosa di simile:

// Read the file stream into a file upload 
var stream = req.file('fileName'); 

gm(stream).resize(200, 200).write('storedImage.png', function(err){ 
    // File is now resized to 200x200 px and uploaded to storedImage.png 
}); 

Il mio problema è: come faccio a prelevo correttamente il flusso da req.file('fileName') di inviare a gm?

risposta

12

Questo dovrebbe funzionare per voi:

var Writable = require('stream').Writable; 
var resize = require('image-resize-stream')(100); // Or any other resizer 

// The output stream to pipe to 
var output = require('fs').createWriteStream('storedImage.png'); 

// Let's create a custom receiver 
var receiver = new Writable({objectMode: true}); 
receiver._write = function(file, enc, cb) { 
    file.pipe(resize).pipe(output); 

    cb(); 
}; 

Ora nella vostra azione è necessario solo per utilizzare il ricevitore:

req.file('fileName').upload(receiver, function(err, files){ 
    // File is now resized to 100px width and uploaded to ./storedImage.png 
}); 

Ho la sensazione che le API di Skipper sta per cambiare, un sacco , ma per ora funzionerà (con v0.1.x).

UPDATE

In particolare, se si utilizza gm per il ridimensionamento, sarà qualcosa di simile:

var gm = require('gm'); 
var Writable = require('stream').Writable; 

// The output stream to pipe to 
var output = require('fs').createWriteStream('storedImage.png'); 

// Let's create a custom receiver 
var receiver = new Writable({objectMode: true}); 
receiver._write = function(file, enc, cb) { 
    gm(file).resize('200', '200').stream().pipe(output); 

    cb(); 
}; 
+0

Come implementeresti gm (graphicsmagick) come resizer? – hansmei

+0

@hansmei Aggiornato. – bredikhin

+0

Grazie mille! – hansmei

1

ho avuto problemi con la soluzione @bredikhin così ho scavare più a fondo questo e abbiamo trovato questo thread molto utile: Uploading files using Skipper with Sails.js v0.10 - how to retrieve new file name

Ho appena cambiato una riga del suo Uploader:

[...]  

file.pipe(outputs); 

[...] 

in:

gm(file).resize(200, 200).stream().pipe(outputs); 

e questo fa il trucco.

Ho scritto questa risposta perché potrebbe essere utile per qualcuno.

+1

Non è esattamente quello che ha detto @bredikhin nel suo post aggiornato? – hansmei