【发布时间】:2011-12-07 07:46:18
【问题描述】:
如您所知,HTML 5 提供了一个不错的 FileAPI。我建立了一个系统,用户接收 Base64 编码的字符串,需要写入磁盘(具有适当的权限,因为它是 Google Chrome 应用程序)。我的代码如下:(清除一些不必要的东西)
function onInitFs(fs){
fs.root.getFile(fileName, {create: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
var bb = new window.WebKitBlobBuilder();
bb.append( atob(dataInBase64Format));
fileWriter.write(bb.getBlob());
}, errorHandler);
console.log( fileEntry.toURL());
}, errorHandler);
}
但是,我的原始文件大小是:6302446 字节,服务器将它们作为 Base64 以 8403264 字节发送,但保存的文件是 9242715 字节。当然,我知道出了点问题,我查看了文件,它只是一个不错的字符串。没有花哨的字符出现。我假设我以文本模式编写,而 atob 只是将其转换为另一个字符串;我需要将其转换为二进制格式(也许是数组?)并强制我的 fileWriter 以二进制模式而不是文本模式写入。我在网上搜索过,但找不到解决方案。我在 StackOverflow Are Google Chrome Base64 methods capable of handling binary data from the File API? 上找到了这个问题,但对我没有帮助。
如何将我的 Base64 字符串转换为正确的数据结构并让我的 fileWriter 来编写它?
【问题讨论】:
-
我也遇到了这个问题。我在 Blob 规范中找到了原因:w3c.github.io/FileAPI/#blob。它会尝试将您提供的任何 DOMStrings 重新编码为 UTF-8。这也会导致字符串中的无效 Unicode 字符被 U+FFFD 替换字符替换。显然,这会对您尝试添加的二进制数据造成非常不利的影响。
标签: javascript html google-chrome blob fileapi