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

时间:2012-08-01 17:37:30

标签: javascript node.js express graphicsmagick

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

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

我已经读过你可以在将node-formidable文件流写入磁盘之前保留它,并且由于gm可以接受流而不仅仅是路径,所以我应该能够通过消除双重写入磁盘来传递此权限。

我认为我需要覆盖form.onPart,但我不确定在哪里(应该作为Express中间件完成吗?)而且我不确定如何抓住{{1}或者与form究竟有什么关系。这是我在几个地方看到的代码框架:

part

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

1 个答案:

答案 0 :(得分: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'));
  });
};

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

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