2012-08-01 10 views
5

Sto utilizzando Express.js e ho un percorso per caricare le immagini che devo quindi ridimensionare. Attualmente mi limito a scrivere il file su disco (che credo utilizzi node-formidable sotto le copertine) e ridimensionarlo utilizzando gm (http://aheckmann.github.com/gm/) che scrive una seconda versione sul disco.File di flusso caricato con Express.js tramite gm per eliminare la doppia scrittura

gm(path) 
    .resize(540,404) 
    .write(dest, function (err) { ... }); 

Ho letto che si può ottenere una sospensione del flusso node-formidable file prima che scrive su disco, e dal momento che gm può accettare un flusso invece di un percorso, dovrei essere in grado di passare questo diritto eliminando la doppia scrittura su disco.

Penso di aver bisogno di ignorare form.onPart, ma non sono sicuro dove (dovrebbe essere fatto come Express middleware?) E io non sono sicuro di come ottenere una sospensione di form o che cosa esattamente a che fare con la part. Questo è lo scheletro del codice che ho visto in alcuni punti:

form.onPart = function(part) { 
    if (!part.filename) { form.handlePart(part); return; } 

    part.on('data', function(buffer) { 

    }); 
    part.on('end', function() { 

    } 
} 

Qualcuno può aiutarmi a mettere insieme questi due pezzi? Grazie!

risposta

7

Sei sulla strada giusta riscrivendo form.onPart. Formidable scrive su disco di default, quindi vuoi agire prima che lo faccia.

Le parti stesse sono flussi, quindi è possibile reindirizzare tutto ciò che si desidera, incluso gm. Non ho ancora testato, ma questo ha un senso sulla base della documentazione:

var form = new formidable.IncomingForm; 
form.onPart = function (part) { 
    if (!part.filename) return this.handlePart(part); 

    gm(part).resize(200, 200).stream(function (err, stdout, stderr) { 
    stdout.pipe(fs.createWriteStream('my/new/path/to/img.png')); 
    }); 
}; 

Per quanto riguarda il middleware, mi piacerebbe CopyPaste il multipart middleware da Connect/Express e aggiungere la funzione onPart ad esso:

Sarebbe molto più bello se formidable non scrivesse sul disco per impostazione predefinita o se avesse preso una bandiera, non è vero? Potresti inviare loro un problema.

+0

Grazie! Questo mi ha fatto il 95% del modo in cui ci sono. Il mio ultimo problema è che 'gm' è asincrono e quindi l'analisi della forma ritorna prima che il ridimensionamento sia effettivamente completato (il che significa che l'url che ho ricevuto dal client non è ancora buono). C'è un modo per far sapere a 'formidable 'quando la gestione di' parte' è effettivamente completa? – Bill

+0

In realtà, ho appena finito di gestirlo sul client - funziona meglio in questo modo. Grazie ancora! – Bill

+1

stdout è un flusso. Ecco perché puoi pipe() su un file WriteStream. Ciò significa che ha un evento di "fine" che puoi ascoltare. Basta fare stdout.on ('end', fn) e questo è quando puoi dire al cliente che il lavoro è finito. – juandopazo