使用Express.js通过gm上传的流文件,以消除双重写入

Bil*_*ill 5 javascript node.js graphicsmagick express

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

gm(path)
  .resize(540,404)
  .write(dest, function (err) { ... });
Run Code Online (Sandbox Code Playgroud)

我已经读过你可以在将node-formidable文件流写入磁盘之前获取文件流,并且因为gm可以接受流而不仅仅是路径,所以我应该能够通过消除双重写入磁盘来传递这一点.

我想我需要覆盖,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() {

    }
}
Run Code Online (Sandbox Code Playgroud)

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

jua*_*azo 7

你通过重写走在正确的轨道上form.onPart.默认情况下,Formidable写入磁盘,因此您希望在此之前执行操作.

部件本身就是Streams,因此您可以将它们管道化为您想要的任何内容,包括gm.我还没有对它进行过测试,但这基于文档是有意义的:

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'));
  });
};
Run Code Online (Sandbox Code Playgroud)

至于中间件,我会multipart从Connect/Express中复制中间件并将onPart功能添加到它:http://www.senchalabs.org/connect/multipart.html

如果formidable默认情况下没有写入磁盘或者它是否带有标志,它会好很多,不是吗?你可以向他们发一个问题.