将同一文件的多个 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

YAML 将多个锚点合并到同一个映射中

怎样将以保存下来多个.html文件合并在一起生成1个.html文件?

将多个 openpyxl xlsx 工作簿合并为一个 .zip 文件以供下载

EXCEL如何把同一个目录下多个工作薄合并到一个工作薄

怎么把几个Excel合并成一个文件?