Javascript 将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件无法读取
我将一个文件(PDF或PNG)作为二进制字符串存储在indexedDB中,并在以后检索它 由于我不知道的原因,下载的文件与原始文件略有不同。 当原始文件按预期打开时,我无法使用适当的软件(即PDF阅读器)打开下载的文件 存储纯文本文件时,使用Javascript 将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件无法读取,javascript,Javascript,我将一个文件(PDF或PNG)作为二进制字符串存储在indexedDB中,并在以后检索它 由于我不知道的原因,下载的文件与原始文件略有不同。 当原始文件按预期打开时,我无法使用适当的软件(即PDF阅读器)打开下载的文件 存储纯文本文件时,使用diff或cmp进行检查时,文件完全相同 我注意到在十六进制编辑器中查看二进制文件时存在一些差异,如下所示。 根据cmp,这些是唯一的区别 原件: 00000000: 2550 4446 2d31 2e35 0a25 d0d4 c5d8 0a31 %PDF
diff
或cmp
进行检查时,文件完全相同
我注意到在十六进制编辑器中查看二进制文件时存在一些差异,如下所示。
根据cmp
,这些是唯一的区别
原件:
00000000: 2550 4446 2d31 2e35 0a25 d0d4 c5d8 0a31 %PDF-1.5.%.....1
00000010: 3533 2030 206f 626a 0a3c 3c0a 2f4c 656e 53 0 obj.<<./Len
去
下载
我将存储的base64文件与编码为base64的原始文件进行了比较。
这些文件之间没有区别,因此这可能与文件在下载之前的编码方式有关
element.setAttribute('href', 'data:' + dlReq.result.type + ';charset=utf-8,' + encodeURIComponent(atob(dlReq.result.data)));
可能是charset
被设置为错误的值以正确编码文件,尽管我不确定这一点
我的解决方法是将这一行更改为直接从base64下载文件,而不是对其进行解码并对URI组件进行编码
element.setAttribute('href', 'data:' + dlReq.result.type + ';base64,' + dlReq.result.data);
此方法生成的文件已下载并打开,没有问题。为什么不将这些文件直接存储为二进制文件?IndexedDB可以存储水滴。@Kaido事后看来,这应该是我第一次尝试的。在这一点上,我很好奇为什么这个案例中的文件是不同的。接下来,我将切换到存储blob。
element.setAttribute('href', 'data:' + dlReq.result.type + ';base64,' + dlReq.result.data);