【问题标题】:Stream file uploaded with Express.js through gm to eliminate double write通过gm使用Express.js上传的流文件消除双重写入
【发布时间】:2012-08-01 17:37:29
【问题描述】:

我正在使用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() {

    }
}

谁能帮我把这两部分放在一起?谢谢!

【问题讨论】:

    标签: javascript node.js express graphicsmagick


    【解决方案1】:

    通过重写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'));
      });
    };
    

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

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

    【讨论】:

    • 谢谢!这让我成功了 95%。我的最后一个问题是 gm 是异步的,因此表单解析在调整大小实际完成之前返回(这意味着我返回给客户端的 url 还不是很好)。有没有办法让formidable 知道part 处理何时真正完成?
    • 实际上,我只是在客户端上处理了这个问题——这样效果更好。再次感谢!
    • stdout 是一个流。这就是为什么您可以将它通过管道()传递到文件 WriteStream.这意味着它有一个你可以收听的“结束”事件。只需执行 stdout.on('end', fn) 即可告诉客户工作已完成。
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多