Размер изображения Skipper в SailsJS (бета) перед загрузкой

Я использую SailsJS (бета). Я пытаюсь найти способ использовать graphicsmagick для обработки потока, проанализированного Skipper в SailsJS-beta, чтобы изменить размер изображения перед вызовом функции Skipper. req.file('inputName').upload(),

Моя цель - взять мое большое оригинальное изображение и изменить его размер перед загрузкой. Бета-версия Sails представила Skipper-file-parser, который плохо документирован (по крайней мере, я этого не понимаю). Пожалуйста, помогите мне понять, как изменить размер изображения перед загрузкой.

Это работает (код в моем действии контроллера):

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') отправить его в гм?

2 ответа

Решение

Это должно работать для вас:

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

У меня есть ощущение, что API Skipper сильно изменится, но пока это будет работать (с 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();
};

У меня были проблемы с решением @bredikhin, поэтому я углубился в это и нашел эту тему очень полезной: загрузка файлов с помощью Skipper с Sails.js v0.10 - как получить новое имя файла

Я только что изменил одну строчку его Uploader:

[...]    

file.pipe(outputs);

[...]

в:

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

и это делает трюк.

Я написал этот ответ, потому что он может быть полезен для кого-то.

Другие вопросы по тегам