【问题标题】:How can I get a buffer for a file (image) from CollectionFS如何从 CollectionFS 获取文件(图像)的缓冲区
【发布时间】:2015-09-08 14:29:33
【问题描述】:

我正在尝试将图像插入到我正在使用 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 放入浏览器时,图像就会出现。我错过了什么吗?

【问题讨论】:

  • “永远不会回来”是什么意思?您在代码中如何/在何处使用这些解决方案。第二个应该可以工作。
  • 另外,你在哪里打电话给readStream.read()
  • “永远不会回来”是指永远不会执行“结束”事件的回调(我在控制台中看不到日志消息)。
  • 在第二次尝试中,我在第三行末尾调用了 readStream.read()。
  • github.com/CollectionFS/Meteor-CollectionFS/issues/457 查看 Icellan 帖子底部的示例。 注意:确保在事件处理程序中将readable 替换为data

标签: javascript node.js meteor node-pdfkit collectionfs


【解决方案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')

希望对您有所帮助!

【讨论】:

  • 我还没有测试过,但它看起来正是我想要弄清楚的。早在 7 月,我刚刚将 base 64 字符串直接保存在集合中,但这会占用更多空间。感谢您的帮助。
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2013-06-11
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多