解码 Base64 pdf 给出损坏的文件

Ant*_*ton 7 base64 decoding node.js

有人可以解释为什么解码 Base64 会产生损坏的 pdf 吗?我需要找到如何解码 Base64 并导出 pdf 的方法。当我使用这项服务时

https://emn178.github.io/online-tools/base64_decode_file.html

我能够通过 Base64 并毫无问题地获取文件。

但是当我在 node.js 中做同样的事情时,我总是得到空(损坏的)文件。我尝试了不同的软件包,例如:js-base64、atob

他们都没有工作,结果得到相同的空文件。

链接到我的代码: https : //repl.it/@afiliptsov/FaroffGloriousFormula

Vic*_*tor 15

你得到一个损坏的 PDF,因为:

  1. 根据官方文档,该 Base64.decode()函数将 Base64 值解码为 UTF-8 字符串。如您所见,这是错误的函数,因为您需要将值解码为二进制数据。
  2. Base64.atob()函数完全符合您的需要,但是在保存数据时会出错,因为根据 官方文档,该fs.writeFile() 函数默认将数据保存为 UTF-8,而您想要保存二进制数据。

要正确解码 Base64 值并将其存储为二进制数据,根据您的需要,您可以选择以下方法之一:

require('js-base64').Base64.atob()

Base64.atob()保存文件时使用并指定二进制编码对 Base64 值进行解码。这仅在您需要处理二进制数据时有用。与其他方法不同,您必须安装和加载“js-base64”模块。

var bin = Base64.atob(stringToDecode);
// Your code to handle binary data
fs.writeFile('result_binary.pdf', bin, 'binary', error => {
    if (error) {
        throw error;
    } else {
        console.log('binary saved!');
    }
});
Run Code Online (Sandbox Code Playgroud)

缓冲区

使用将 Base64 值转换为缓冲区Buffer.from()并将其保存到文件中而不指定编码。这仅在您需要处理缓冲区时有用。

var buf = Buffer.from(stringToDecode, 'base64');
// Your code to handle buffer
fs.writeFile('result_buffer.pdf', buf, error => {
    if (error) {
        throw error;
    } else {
        console.log('buffer saved!');
    }
});
Run Code Online (Sandbox Code Playgroud)

编码选项

如果您不需要读取/修改二进制数据或缓冲区,只需在保存文件时指定编码选项。这种方法是最简单的方法,可能是最快和最有效的内存方法。

fs.writeFile('result_base64.pdf', stringToDecode, 'base64', error => {
    if (error) {
        throw error;
    } else {
        console.log('base64 saved!');
    }
});
Run Code Online (Sandbox Code Playgroud)


bkn*_*hts 5

对我来说,通过阅读 @victor 的答案解决的一个相关问题是 Express.js 应用程序从 API 获取 bas64 编码的 PDF,并希望将其作为“正确的”pdf 返回给客户端:

res.set({
    'Content-Disposition' : 'attachment; filename='+ data.fileName,
    'Content-Type': 'application/pdf',
});
res.send(Buffer.from(data.content, 'base64'));
Run Code Online (Sandbox Code Playgroud)