我正在使用 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() {
}
}
谁能帮我把这两部分放在一起?谢谢!
最佳答案
通过重写 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/