如何从CollectionFS获取文件(图像)的缓冲区

13
我正在尝试在使用PDFkit创建服务器端PDF时将图像插入其中。我使用cfs:dropbox存储我的文件。以前,当我使用cvs:filesystem时,很容易添加我的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时,图像也出现了。我错过了什么吗?


“永远不会回来”是什么意思?你在代码中如何/在哪里使用这些解决方案?第二个应该有效。 - Christian Fritz
另外,你是否在任何地方调用了 readStream.read() - Christian Fritz
“永远不会回来”是指“end”事件的回调从未执行(我在控制台中看不到日志消息)。 - Jared Martin
在我的第二次尝试中,我在第三行的末尾调用了readStream.read()。 - Jared Martin
请查看Icellan在帖子底部发布的示例。*注意:确保在事件处理程序中将readable替换为data*。 - Brian Shamblen
Brian,你的答案似乎是正确的。不幸的是,在悬赏结束之前我没有机会尝试它。为什么不把它作为答案添加进来,这样你就能得到一些悬赏了呢?请确保在此处复制答案,而不仅仅是链接。否则管理员会抱怨的。等我测试过后,我会将其标记为正确的。 - Jared Martin
1个回答

5

我曾经遇到了类似的问题,既然这个问题没有答案,下面是我的解决方法:

// 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')

希望这会有所帮助!

我还没有测试过它,但它看起来正是我想要解决的问题。七月份时,我只是直接将base64字符串保存在集合中,但这使用了更多的空间。感谢您的帮助。 - Jared Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接