2015-05-19 6 views
0

Как создать новое изображение на сервере и вставить его в коллекцию [используя Meteor/CollectionFS + GridFS]?CollectionFS: вставить изображение, сгенерированное на сервер

Вики объясняет 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); 

... но как я создаю ReadStream для типа [изображение/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)

... который, кажется, предполагает, что проблема связана с графикой.

ответ

0

решаемые с помощью @ Андрей.Фил 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.