CollectionFS:插入服务器端生成的图像
CollectionFS: insert image generated server-side
如何在服务器上生成新图像并将其插入到集合中[使用 Meteor/CollectionFS + GridFS]?
wiki 解释 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
错误。
------------------------{编辑 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)? Exception in callback of async function: Error: Stream yields empty buffer
I20150520-16:29:10.379(-5)? at 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)? at 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 上。
在 @andrew-lavers 对
的回复的帮助下解决了
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 方法中删除第一个参数。
如何在服务器上生成新图像并将其插入到集合中[使用 Meteor/CollectionFS + GridFS]?
wiki 解释 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
错误。
------------------------{编辑 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)? Exception in callback of async function: Error: Stream yields empty buffer
I20150520-16:29:10.379(-5)? at 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)? at 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 上。
在 @andrew-lavers 对
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 方法中删除第一个参数。