【发布时间】:2014-05-21 22:38:49
【问题描述】:
我一直在使用一些 JS 加密库(CryptoJS、SJCL)并发现与 Blob/File API 和 JavaScript“二进制字符串”相关的问题。
我意识到加密甚至不是真正相关的,所以这里有一个非常简化的场景。只需使用 readAsBinaryString 读取一个文件,然后创建一个 Blob:
>>> reader.result
"GIF89a����ÿÿÿÿÿÿ!þCreated with GIMP�,�������D�;"
>>> reader.result.length
56
>>> typeof reader.result
"string"
>>> blob = new Blob([reader.result], {type: "image/gif"})
Blob { size=64, type="image/gif", constructor=function(), more...}
我创建了一个 JSFiddle,它基本上可以完成上述工作:它只是读取任意文件,从中创建一个 blob,然后输出长度与大小: http://jsfiddle.net/6L82t/1/
看起来,当从“二进制 (javascript) 字符串”创建 Blob 时,带有字符编码的东西最终会改变结果。
如果使用非二进制文件,你会看到 Blob 的长度和原始二进制字符串的长度是相同的。
因此,当尝试从非纯文本 Javascript 字符串创建 Blob/文件时会发生一些事情,我需要任何不会发生的事情。我认为这可能与 JS 字符串是 UTF-16 的事实有关?
这里有一个(可能)相关的线程: HTML5 File API read as text and binary
在将它们放入 Blob/文件之前,我是否需要获取解密结果 (UTF-16) 并将它们“转换”为 UTF-8?
在 Freenode 上与 #html5 中的某个人合作后,我们确定如果您直接读取 ArrayBuffer,然后首先使用 Uint8Array 从中创建 blob,那么字节就可以正常工作。你可以在这里看到一个基本上可以做到这一点的小提琴: http://jsfiddle.net/GH7pS/4/
问题是,至少在我的场景中,我最终会得到一个二进制字符串,并想弄清楚如何直接将其转换为 Blob,以便我可以使用 html5 的下载来允许用户点击直接下载blob。
谢谢!
【问题讨论】:
-
您确实意识到您的帖子already has a comprehensive edit history,对吗?您可以通过将鼠标悬停在 SE 网页上获取发布在 SE 网页上的任何时间的准确时间戳;试试你名字上方的“2 小时前询问”。
标签: javascript html