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

Я использую SailsJS (бета). Я пытаюсь найти способ использовать graphicsmagick для обработки потока, проанализированного Skipper в бета-версии SailsJS, для изменения размера изображения перед вызовом функции 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'), чтобы отправить его в gm?


person hansmei    schedule 05.06.2014    source источник


Ответы (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 сильно изменится, но пока это будет работать (с версией 0.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();
};
person bredikhin    schedule 12.06.2014
comment
Как бы мне также загрузить этот файл на s3 со шкипером s3. Пытаюсь вернуть параметры skipper-s3 в .upload - person Daniel Payne; 09.03.2016

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

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

[...]    

file.pipe(outputs);

[...]

в:

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

и это делает свое дело.

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

person mkatanski    schedule 21.06.2015
comment
Разве это не то, что @bredikhin сказал в своем обновленном посте? - person hansmei; 01.07.2015