CollectionFS:插入生成服务器端的映像

时间:2015-05-19 21:55:12

标签: meteor graphicsmagick collectionfs

如何在服务器上生成新图像并将其插入集合[使用Meteor / CollectionFS + GridFS]?

维基解释how to insert from a stream on the server

var readStream = spawn('ls', []).stdout;
var newFile = new FS.File();
newFile.attachData(readStream, {type: 'text/plain'});
newFile.name('ls_result.txt');
Files.insert(newFile);

...但是如何为[image / png]类型创建一个读取流?

--------------------------- {编辑} -------------- -------------

我试过了:

var fs = Npm.require('fs');
var writeStream = fs.createWriteStream( 'test.png' );
gm(200, 200, '#000F')
    .setFormat('png')
    .fill('black')
    .drawCircle( 10, 10, 190, 190 )
    .stream('png')
    .pipe(writeStream);
var readStream = fs.createReadStream( 'test.png' );
// ...insert as above

...创建文件test.png但没有数据(0字节)。因此,插入失败并出现unknown filesize错误。

--------------------------- {edit 2.0} ------------- --------------

尝试以下感觉就像我需要的解决方案......但它以类似的方式失败:

gm(200, 200, '#000F')
    .setFormat('png')
    .fill('black')
    .drawCircle( 50, 50, 60, 60 )
    .toBuffer( 'PNG', Meteor.bindEnvironment( function( error, buffer )
    {
        if( error ) throw error;

        var file = new FS.File();
        file.attachData( buffer, {type: 'image/png'}, function( err )
        {
            if( err ) throw err;
            file.name( 'test.png' );
            Collections.Builds.insert( file );
        });
    })
);

这会引发错误:

  

I20150520-16:29:10.379(-5)?异步函数回调中的异常:错误:Stream产生空缓冲区

     

I20150520-16:29:10.379(-5)?在Socket。 (/Users/andrew/.meteor/packages/cfs_graphicsmagick/.0.0.18.rl55ru++os+web.browser+web.cordova/npm/node_modules/gm/lib/command.js:65:17)

     

I20150520-16:29:10.379(-5)?在Socket.emit(events.js:117:20)

     

I20150520-16:29:10.379(-5)? at _stream_readable.js:944:16

     

I20150520-16:29:10.379(-5)? at process._tickCallback(node.js:442:13)

......这似乎表明问题出在graphicsmagick上。

1 个答案:

答案 0 :(得分:0)

在@ andrew-lavers对this question

的回复的帮助下解决
gm(200, 200, '#000F')
    .setFormat('png')
    .fill('black')
    .drawCircle( 50, 50, 60, 60 )
    .toBuffer( Meteor.bindEnvironment( function( error, buffer )
    {
        if( error ) throw error;

        var file = new FS.File();
        file.attachData( buffer, {type: 'image/png'}, function( err )
        {
            if( err ) throw err;
            file.name( 'test.png' );
            Collections.Builds.insert( file );
        });
    })
);

如您所见,我非常接近......只需要从gm.toBuffer方法中删除第一个参数。