Размер изображения 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);
и это делает трюк.
Я написал этот ответ, потому что он может быть полезен для кого-то.