一尘不染

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

node.js

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

    }
}

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


阅读 291

收藏
2020-07-07

共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'));
  });
};

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

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

2020-07-07