graphicsmagick и cfs: хранить одно обрезанное изображение в трех хранилищах - создавая временный поток
Я пытаюсь сделать некоторые обрезки, используя graphicsmagick
а также cfs
и сохраните результат в S3 (cfs:gridfs, cfs:graphicsmagick и cfs:s3).
Обрезанное изображение должно быть сохранено в трех хранилищах (основном, общедоступном и миниатюре) - в самих магазинах есть несколько transformWrite
функции. Поэтому я подумал, что для этого нужно создать временный поток, но мне не удалось создать этот временный поток. Мне нужна помощь для этого.
Я использую gridFS, нет файловой системы
var file = Media.findOne({ _id: fileId }),
read = file.createReadStream('main');
gmread = gm(read)
.crop(selection.w, selection.h, selection.x, selection.y)
.stream();
gmread.on('end', Meteor.bindEnvironment(function (error, result) {
if (error)
console.warn(error);
// create a temp stream
var tmpread = fs.createReadStream(filename); // <-- MY PROBLEM
tmpread.on('end', Meteor.bindEnvironment(function (error, result) {
if (error)
console.warn(error);
}));
// set cropped image to main store
var write = file.createWriteStream('main');
tmpread.pipe(write);
// set public store image
var writePublic = file.createWriteStream('public');
gm(tmpread).stream().pipe(writePublic);
// set thumbnail image
var writeThumbnail = file.createWriteStream('thumbnail');
gm(tmpread).stream().pipe(writeThumbnail);
}));
gmread.pipe(temp);
2 ответа
Я не уверен, правильно ли я понимаю вашу проблему, но вы можете использовать поток PassThrough, в который вы записываете результат один раз.
На самом деле вам не нужно создавать временный поток, чтобы сделать это, вы можете просто использовать функции transformWrite. Также вам не нужно использовать тех слушателей событий, вот рабочий пример, который я использую в своем проекте
var profilePictureResize = function(fileObj,readStream,writeStream){
gm(readStream,fileObj.name()).resize('76','76^').gravity('Center').extent('76', '76').stream().pipe(writeStream);
}
var previewResize = function(fileObj,readStream,writeStream){
gm(readStream,fileObj.name()).resize('240','160^').gravity('Center').extent('240', '160').stream().pipe(writeStream);
}
Images = new FS.Collection("images", {
stores: [
new FS.Store.FileSystem("images"),
new FS.Store.FileSystem("profileSize",{transformWrite: profilePictureResize}),
new FS.Store.FileSystem("previewSize",{transformWrite: previewResize})
],
// permit only images here
filter: {
allow: {
contentTypes: ['image/*']
}
}
});