通过gm通过Express.js上传stream文件以消除双重写入

我正在使用Express.js并有一个上传图像的路线,然后我需要resize。 目前我只是让Express写入文件到磁盘(我认为使用node-formidable下),然后调整使用gm (http://aheckmann.github.com/gm/)写入第二个版本到磁盘。

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

我已经读过,你可以在将node-formidable文件stream写入磁盘之前获得一个node-formidable ,因为gm可以接受一个stream而不是一个path,所以我应该可以通过消除双重写到磁盘。

我想我需要覆盖form.onPart但我不知道在哪里(应该做Express中间件?),我不知道如何得到一个form或与该part究竟做什么。 这是我在几个地方见过的代码框架:

 form.onPart = function(part) { if (!part.filename) { form.handlePart(part); return; } part.on('data', function(buffer) { }); part.on('end', function() { } } 

有人可以帮我把这两块放在一起吗? 谢谢!

通过重写form.onPart您正处于正确的轨道上。 强大的写入磁盘默认情况下,所以你想行事之前。

零件本身是stream,所以你可以将它们pipe到任何你想要的,包括gm 。 我还没有testing过,但这是有道理的基础上的文档:

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

至于中间件,我想从Connect / Express中复制multipart中间件,并添加onPart函数: http : //www.senchalabs.org/connect/multipart.html

如果formidable没有写入磁盘默认情况下,或者如果它拿着一个标志,它会好得多,不是吗? 你可以给他们发一个问题。