Node.JS - 使用Buffer将图片编码为base64

28

我正在尝试在Node.JS中使用base64对图像进行编码,并将其作为附件传递给PostageApp API。我认为已经成功了,但它附加了一个大小为1K的文件,这不完全是我想要的。

这是我的代码:

 var base64data;

 fs.readFile(attachment, function(err, data) {
   base64data = new Buffer(data).toString('base64');
 });

这里是我正在进行的API调用的部分:

 attachments: {
   "attachment.txt" : {
     content_type: "application/octet-stream",
     content: base64data
   },
 }

我有些迷茫,对Node不是很熟悉,但我认为它应该能用。希望能得到帮助!


@Jim Schubert,那个建议是错误和糟糕的。首先,readFile会读取整个文件,而不是块。其次,阻塞代码会阻塞整个服务器,这是一个愚蠢的想法。 - thejh
3个回答

46
fs.readFile(attachment, function(err, data) {
   var base64data = new Buffer(data).toString('base64');
   [your API call here]
});

获取结果需要一些时间,因此当你获得这些数据时,外部作用域的执行已经结束了。


不幸的是,我将base64data传递到有效负载中,这实际上是一个JSON哈希表,然后将其POST到API服务器。这样做是否更好? - JonLim
@JonLim,这基本上是唯一的方法。你必须在回调函数中完成所有这些操作(“将base64数据传递到有效载荷中,这实际上是一个JSON哈希表,然后将其POST到API服务器”)。 - thejh
啊,没有其他办法吗?这很糟糕,因为附件参数是可选的,所以如果没有附件,它就不会被包括在内。不过还是谢谢! - JonLim
1
@JonLim,如果没有附件,请为您的回调创建一个命名函数并直接触发它。 - thejh
太棒了,谢谢!不过我还有一个问题:如果我需要上传多个文件怎么办? - JonLim
显示剩余2条评论

13

只需将编码指定为"base64"。根据文档

如果未指定编码,则返回原始缓冲区。

fs.readFile(attachment, {encoding: 'base64'}, function(err, base64data) {
   [your API call here]
});

readFile的编码不是你想要编码的内容,而是附件的编码,对吗? - Sam
1
在文档中,编码可以是Buffer接受的任何一种编码方式,尽管它属于createReadStream。我尝试了@hyphenthis所说的方法,它起作用了。 - Kennyhyun

0
截至2023年3月,我发现这个解决方案非常有用,因为接受的答案现在已经过时了。使用new Buffer.frombase64参数代替new Buffer可以解决问题。
base64data = new Buffer.from(data, 'base64').toString('base64');

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