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/*']
        }
    }
});
Другие вопросы по тегам