5

我正在使用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中间件完成?)而且我不确定如何获取form或如何处理part. 这是我在几个地方看到的代码骨架:

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

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

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

    }
}

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

4

1 回答 1

7

通过重写,您走在了正确的轨道上form.onPart。强大的默认写入磁盘,所以你想在它之前采取行动。

部件本身就是流,因此您可以将它们通过管道传输到您想要的任何内容,包括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'));
  });
};

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

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

于 2012-08-03T18:28:50.080 回答