2012-08-01 8 views
5

Estoy usando Express.js y tengo una ruta para subir imágenes que luego necesito cambiar el tamaño. Actualmente solo dejo Express escribir el archivo en el disco (que creo que usa node-formidable debajo de las cubiertas) y luego cambiar el tamaño usando gm (http://aheckmann.github.com/gm/) que escribe una segunda versión en el disco.Archivo de transmisión cargado con Express.js a través de gm para eliminar la escritura doble

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

He leído que se puede obtener una bodega de la corriente node-formidable archivo antes de que lo escribe en el disco, y desde gm puede aceptar una corriente en lugar de sólo un camino, yo debería ser capaz de pasar este derecho mediante la eliminación de la doble escritura en el disco.

Creo que necesito para anular form.onPart pero no estoy seguro de que (se ha de hacer como Express middleware?) Y no estoy seguro de cómo obtener una bodega de form o qué es exactamente lo que hacer con el part. Este es el esqueleto del código que he visto en algunos lugares:

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

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

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

    } 
} 

¿Alguien puede ayudarme a unir estas dos piezas? ¡Gracias!

Respuesta

7

Está en el camino correcto reescribiendo form.onPart. Formidable escribe en el disco de forma predeterminada, por lo que desea actuar antes de hacerlo.

Las piezas en sí son Streams, por lo que puede canalizarlas a lo que desee, incluido gm. Yo no lo he probado, pero esto tiene sentido sobre la base de la documentación:

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')); 
    }); 
}; 

En cuanto al middleware, me CopyPaste la multipart middleware de Conectar/Express y añadir la función onPart a ella:

Sería mucho más agradable si formidable no escribiera en el disco de forma predeterminada o si tomara una marca, ¿o no? Podrías enviarles un problema.

+0

¡Gracias! Esto me dio el 95% del camino allí. Mi último problema es que 'gm' es asíncrono y, por lo tanto, el análisis del formulario vuelve antes de que el cambio de tamaño esté realmente completo (lo que significa que la URL que tenía para el cliente aún no es buena). ¿Hay alguna manera de dejar que 'formidable' sepa cuándo el manejo de la 'parte' está realmente completo? – Bill

+0

En realidad, terminé manejando esto en el cliente en su lugar, funciona mejor de esa manera. ¡Gracias de nuevo! – Bill

+1

stdout es un Stream. Es por eso que puede canalizarlo() a un archivo WriteStream. Y eso significa que tiene un evento "final" que puedes escuchar. Simplemente haga stdout.on ('end', fn) y es entonces cuando puede decirle al cliente que el trabajo está hecho. – juandopazo

Cuestiones relacionadas