javascript - 通过 gm 流式传输使用 Express.js 上传的文件以消除双写

标签 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 中间件完成吗?)而且我不确定如何掌握 formpart 的确切用途。这是我在几个地方看到的代码框架:

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

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

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

    }
}

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

最佳答案

通过重写 form.onPart,您走在了正确的轨道上。 Formidable 默认写入磁盘,因此您想抢在它之前采取行动。

部件本身是流,因此您可以将它们通过管道传输到您想要的任何位置,包括 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 默认情况下不写入磁盘或者它带有一个标志,那会好很多,不是吗?您可以向他们发送问题。

关于javascript - 通过 gm 流式传输使用 Express.js 上传的文件以消除双写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11764585/

相关文章:

javascript - 需要找到源路径正则表达式

javascript - 正则表达式样式表超出字符串范围

node.js - 如何控制 Node express.js应用程序中排队请求的最大数量?

node.js - 将express与需要数据的第二个div一起使用的正确方法是什么

node.js - ExpressJS - Sequelize - 查询结果未填充到对象中

node.js - Passport.js : how to access user object after authentication?

Javascript 从回调中获取 Promise 结果

javascript - 如何在React Native中从另一个函数调用一个函数

javascript - 绑定(bind)函数的奇怪行为

node.js - 如何从 socket.io-redis 发送私有(private)消息(发出)