javascript - graphicsmagick 和 cfs : Store one cropped image to three stores - creating temp stream

标签 javascript meteor gridfs graphicsmagick collectionfs

我正在尝试使用 graphicsmagickcfs 进行裁剪并将结果保存到 S3(cfs:gridfs、cfs:graphicsmagick 和 cfs:s3)。

裁剪后的图像应存储到三个存储区(主存储区、公共(public)存储区和缩略图存储区)- 存储区本身具有一些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);

最佳答案

实际上您不需要创建临时流来执行此操作,您只需使用 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/*']
        }
    }
});

关于javascript - graphicsmagick 和 cfs : Store one cropped image to three stores - creating temp stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180057/

相关文章:

java - Spring Data MongoDB - 将二进制数据附加到现有的 GridFS 文件

mongodb - 将文件夹存储在 fs.files 集合中

javascript - 将JSON数据放入chart.js饼图中

javascript - 为什么我的单元测试只通过负面案例?

javascript - postman 没有收到 POST 的回复

javascript - AngularJS 将字符串转换为引用 $scope 中对象的对象/数组

javascript - meteor + MongoDB : Check if date is in range

angular - 如何在 Angular2-Meteor 应用程序中使用来自 "meteorhacks"的聚合

terminal - 如何将环境变量 PACKAGE_DIRS 链接到我的本地私有(private)包?

mongodb - 使用 angular、express 和 mongodb 的 gridfs 上传文件