通过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
没有写入磁盘默认情况下,或者如果它拿着一个标志,它会好得多,不是吗? 你可以给他们发一个问题。