Как я могу получить буфер для файла (изображения) из CollectionFS

Я пытаюсь вставить изображение в pdf. Я создаю серверную часть с помощью PDFkit. Я использую cfs: dropbox для хранения моих файлов. Раньше, когда я использовал cvs: файловую систему, было легко добавить изображения в pdf, потому что они были там. Теперь, когда они хранятся удаленно, я не уверен, как их добавлять, поскольку PDFkit не поддерживает добавление изображений только с URL-адресом. Однако он будет принимать буфер. Как я могу получить буфер из моих файлов CollectionFS?

До сих пор у меня есть что-то вроде этого:

var portrait = Portraits.findOne('vS2yFy4gxXdjTtz5d');
readStream = portrait.createReadStream('portraits');

Я пытался получить буфер двумя способами:

Сначала используйте dataMan, но последняя команда никогда не возвращается:

var dataMan = new DataMan.ReadStream(readStream, portrait.type());
var buffer = Meteor.wrapAsync(Function.prototype.bind(dataMan.getBuffer, dataMan))();

Вторая буферизация потока вручную:

var buffer = new Buffer(0);
readStream.on('readable', function() {
    buffer = Buffer.concat([buffer, readStream.read()]);
});
readStream.on('end', function() {
    console.log(buffer.toString('base64'));
});

Это, похоже, никогда не вернется. Я дважды проверил свой документ, чтобы убедиться, что он есть, и он имеет действительный URL-адрес, и изображение появляется, когда я помещаю url в свой браузер. Я что-то пропустил?

Ответ 1

Мне нужно было сделать что-то подобное, и поскольку ответа на этот вопрос нет, вот как я это делаю:

// take a cfs file and return a base64 string
var getBase64Data = function(file, callback) {
  // callback has the form function (err, res) {}
  var readStream = file.createReadStream();
  var buffer = [];
  readStream.on('data', function(chunk) {
    buffer.push(chunk);
  });
  readStream.on('error', function(err) {
    callback(err, null);
  });
  readStream.on('end', function() {
    callback(null, buffer.concat()[0].toString('base64'));
  });
};

// wrap it to make it sync    
var getBase64DataSync = Meteor.wrapAsync(getBase64Data);

// get a cfs file
var file = Files.findOne();

// get the base64 string
var base64str = getBase64DataSync(file);

// get the buffer from the string
var buffer = new Buffer(base64str, 'base64')

Надеюсь, это поможет!