将同一文件的多个 blob 合并为一个以获取原始 pdf 文件
Posted
技术标签:
【中文标题】将同一文件的多个 blob 合并为一个以获取原始 pdf 文件【英文标题】:Merging multiple blobs of same file into one to get back original pdf file 【发布时间】:2019-12-19 16:34:00 【问题描述】:我正在检索作为 blob 存储在我的数据库中的 pdf 文件。但是一些 pdf 文件作为 blob 存储在多个列中。现在如何结合这些 blob 来取回原始文件
如果文件存储在单个列中,那么我的代码可以正常工作。但是对于存储在具有多个 blob 的多个列中的文件,它不起作用
let finalBinary = "";
for (let i = 0; i < data.data.length; i++)
let binary = "";
// data.data[i].FILE_DATA.data is a buffer array
let bytes = new Uint8Array(data.data[i].FILE_DATA.data);
let len = bytes.byteLength;
for (let j = 0; j < len; j++)
binary += String.fromCharCode(bytes[j]);
finalBinary = finalBinary + binary;
window.open(
"data:application/pdf;base64," + escape(window.btoa(finalBinary))
);
实际结果是加载多列pdf的pdf失败。但适用于单列 pdf。
【问题讨论】:
【参考方案1】:您似乎以多种方式破坏了您的二进制数据。 let finalBinary = "";
和 let binary = "";
是一种字符串类型。
尝试以下连接字节数组,例如:
var btoa = require('btoa'); // npm install btoa
function ConcatUint8Arrays(a, b)
const result = new Uint8Array(a.length + b.length);
result.set(a, 0); //Copy a into result
result.set(b, a.length); //Copy b into result, after a
return result;
let a = new Uint8Array(5);
a.fill(47);
let b = new Uint8Array(5);
b.fill(74);
let c = ConcatUint8Arrays(a, b);
console.log(c);
console.log(btoa(c));
这会给你结果:
Uint8Array [
47, 47, 47, 47, 47,
74, 74, 74, 74, 74
]
NDcsNDcsNDcsNDcsNDcsNzQsNzQsNzQsNzQsNzQ=
将其连接到您的原始代码中,例如:
function ConcatArrays(a, b)
const result = new (a.construtor)(a.length + b.length);
result.set(a, 0); //Copy a into result
result.set(b, a.length); //Copy b into result, after a
return result;
let finalBinary = [];
for (let i = 0; i < data.data.length; i++)
// data.data[i].FILE_DATA.data is a buffer array
let bytes = new Uint8Array(data.data[i].FILE_DATA.data);
finalBinary = ConcatArrays(finalBinary, bytes);
window.open(
"data:application/pdf;base64," + escape(window.btoa(finalBinary))
);
希望这会有所帮助。
【讨论】:
以上是关于将同一文件的多个 blob 合并为一个以获取原始 pdf 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 powershell 将两个 azure blob 合并为单个 blob
怎样将以保存下来多个.html文件合并在一起生成1个.html文件?