解码 Base64 pdf 给出损坏的文件
Decoding Base64 pdf giving broken file
有人可以解释一下为什么解码 Base64 会给出损坏的 pdf 吗?
我需要找到解码 Base64 并获取 pdf 的方法。
当我使用这项服务时
https://emn178.github.io/online-tools/base64_decode_file.html
我能够通过 Base64 并毫无问题地取出文件。
但是当我在 node.js 中执行相同操作时,我始终得到空(损坏)文件。
我尝试了不同的包,例如:
js-base64,
阿托布
和 none 他们成功了,得到了与结果相同的空文件。
Link 到我的代码:
https://repl.it/@afiliptsov/FaroffGloriousFormula
简单的就是最好的!只需使用 fs
包将 base64 字符串保存到文件中,请记住您必须为 encoding
选项设置 base64
。
fs.writeFile('result_document.pdf', stringToDecode, 'base64', (error) => {
if (error) throw error;
console.log("Doc saved!");
});
您得到一个损坏的 PDF,因为:
- 根据officially documentation,
Base64.decode()
函数将 Base64 值解码为 UTF-8 字符串。作为
你可以看到,这是错误的功能,因为你需要解码
作为二进制数据的值。
Base64.atob()
函数完全可以满足您的需求,但是您
保存数据时出错,因为,根据
officially documentation,默认情况下 fs.writeFile()
函数将数据保存为UTF-8,而你想保存二进制数据。
要正确解码Base64值并将其存储为二进制数据,根据您的需要,您可以选择以下方法之一:
需要('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!');
}
});
Buffer.from
使用 Buffer.from()
将 Base64 值转换为缓冲区,并在不指定编码的情况下将其保存到文件中。这仅在您需要处理缓冲区时才有用。
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!');
}
});
编码选项
如果不需要read/modify二进制数据或缓冲区,只需在保存文件时指定编码选项即可。这种方法是最简单的一种,可能是最快和最节省内存的。
fs.writeFile('result_base64.pdf', stringToDecode, 'base64', error => {
if (error) {
throw error;
} else {
console.log('base64 saved!');
}
});
通过阅读@victor 的回答解决了我的一个相关问题是 Express.js 应用程序从 API 获取 bas64 编码的 PDF 并想要 return 它作为 'proper' pdf:
发送给客户
res.set({
'Content-Disposition' : 'attachment; filename='+ data.fileName,
'Content-Type': 'application/pdf',
});
res.send(Buffer.from(data.content, 'base64'));
有人可以解释一下为什么解码 Base64 会给出损坏的 pdf 吗? 我需要找到解码 Base64 并获取 pdf 的方法。 当我使用这项服务时
https://emn178.github.io/online-tools/base64_decode_file.html
我能够通过 Base64 并毫无问题地取出文件。
但是当我在 node.js 中执行相同操作时,我始终得到空(损坏)文件。 我尝试了不同的包,例如: js-base64, 阿托布
和 none 他们成功了,得到了与结果相同的空文件。
Link 到我的代码: https://repl.it/@afiliptsov/FaroffGloriousFormula
简单的就是最好的!只需使用 fs
包将 base64 字符串保存到文件中,请记住您必须为 encoding
选项设置 base64
。
fs.writeFile('result_document.pdf', stringToDecode, 'base64', (error) => {
if (error) throw error;
console.log("Doc saved!");
});
您得到一个损坏的 PDF,因为:
- 根据officially documentation,
Base64.decode()
函数将 Base64 值解码为 UTF-8 字符串。作为 你可以看到,这是错误的功能,因为你需要解码 作为二进制数据的值。 Base64.atob()
函数完全可以满足您的需求,但是您 保存数据时出错,因为,根据 officially documentation,默认情况下fs.writeFile()
函数将数据保存为UTF-8,而你想保存二进制数据。
要正确解码Base64值并将其存储为二进制数据,根据您的需要,您可以选择以下方法之一:
需要('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!');
}
});
Buffer.from
使用 Buffer.from()
将 Base64 值转换为缓冲区,并在不指定编码的情况下将其保存到文件中。这仅在您需要处理缓冲区时才有用。
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!');
}
});
编码选项
如果不需要read/modify二进制数据或缓冲区,只需在保存文件时指定编码选项即可。这种方法是最简单的一种,可能是最快和最节省内存的。
fs.writeFile('result_base64.pdf', stringToDecode, 'base64', error => {
if (error) {
throw error;
} else {
console.log('base64 saved!');
}
});
通过阅读@victor 的回答解决了我的一个相关问题是 Express.js 应用程序从 API 获取 bas64 编码的 PDF 并想要 return 它作为 'proper' pdf:
发送给客户res.set({
'Content-Disposition' : 'attachment; filename='+ data.fileName,
'Content-Type': 'application/pdf',
});
res.send(Buffer.from(data.content, 'base64'));