SailsJS(beta)图像中的船长在上传之前调整大小

时间:2014-06-05 19:59:51

标签: image sails.js graphicsmagick skipper

我正在使用SailsJS(测试版)。我试图找到一种方法来使用graphicsmagick来获取SailsJS-beta中Skipper解析的流,以在调用Skipper函数req.file('inputName').upload()之前调整图像大小。

我的目标是拍摄我原始的大图,并在上传之前调整大小。 Sails beta引入了Skipper文件解析器,这些解析器文档很少(至少我不理解它)。请帮助我了解如何在上传前调整图片大小。

这可行(我的控制器操作中的代码):

req.file('fileName').upload('storedImage.png', function(err, files){
  // File is now uploaded to storedImage.png
});

我想要的是:

// Read the file stream into a file upload
var stream = req.file('fileName');

gm(stream).resize(200, 200).write('storedImage.png', function(err){
  // File is now resized to 200x200 px and uploaded to storedImage.png
});

我的问题是:如何正确地从req.file('fileName')获取流以将其发送到gm?

2 个答案:

答案 0 :(得分:13)

这应该适合你:

var Writable = require('stream').Writable;
var resize = require('image-resize-stream')(100); // Or any other resizer

// The output stream to pipe to
var output = require('fs').createWriteStream('storedImage.png');

// Let's create a custom receiver
var receiver = new Writable({objectMode: true});
receiver._write = function(file, enc, cb) {
  file.pipe(resize).pipe(output);

  cb();
};

现在你的行动中你必须使用你的接收器:

req.file('fileName').upload(receiver, function(err, files){
  // File is now resized to 100px width and uploaded to ./storedImage.png
});

我觉得Skipper的API会发生很大的变化,但现在可以使用(使用v0.1.x)。

<强>更新

具体来说,如果使用gm进行调整大小,则可能是这样的:

var gm = require('gm');
var Writable = require('stream').Writable;

// The output stream to pipe to
var output = require('fs').createWriteStream('storedImage.png');

// Let's create a custom receiver
var receiver = new Writable({objectMode: true});
receiver._write = function(file, enc, cb) {
  gm(file).resize('200', '200').stream().pipe(output);

  cb();
};

答案 1 :(得分:1)

我遇到了@bredikhin解决方案的问题,所以我深入研究了这个问题并发现这个帖子非常有用:Uploading files using Skipper with Sails.js v0.10 - how to retrieve new file name

我刚刚更改了Uploader的一行:

[...]    

file.pipe(outputs);

[...]

成:

gm(file).resize(200, 200).stream().pipe(outputs);

这就是诀窍。

我写了这个答案,因为它可能对某人有帮助。