Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件无法读取_Javascript - Fatal编程技术网

Javascript 将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件无法读取

Javascript 将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件无法读取,javascript,Javascript,我将一个文件(PDF或PNG)作为二进制字符串存储在indexedDB中,并在以后检索它 由于我不知道的原因,下载的文件与原始文件略有不同。 当原始文件按预期打开时,我无法使用适当的软件(即PDF阅读器)打开下载的文件 存储纯文本文件时,使用diff或cmp进行检查时,文件完全相同 我注意到在十六进制编辑器中查看二进制文件时存在一些差异,如下所示。 根据cmp,这些是唯一的区别 原件: 00000000: 2550 4446 2d31 2e35 0a25 d0d4 c5d8 0a31 %PDF

我将一个文件(PDF或PNG)作为二进制字符串存储在indexedDB中,并在以后检索它

由于我不知道的原因,下载的文件与原始文件略有不同。 当原始文件按预期打开时,我无法使用适当的软件(即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);