readAsBinaryString()无法正常工作

时间:2017-02-20 20:01:40

标签: javascript filereader

这是我的代码:

var reader = new FileReader();
reader.onload = function(e) {
    download(reader.result, "Test.stl");
}
reader.readAsBinaryString(input_file_field.files[0]);

结果文件:

Result file

原始档案:

Original file

输出几乎相同,几乎没有差异(这不是"下载"功能的问题,如果我将日志放入控制台,则相同)。

关于发生了什么的任何想法?

修改

这是我用于二进制转换的代码(不兼容):

var reader = new FileReader();
reader.onload = function(e) {
    var fileData = reader.result;
    var bytes = new Uint8Array(fileData);
    var binaryText = '';

    for (var index = 0; index < bytes.byteLength; index++) {
        binaryText += String.fromCharCode(bytes[index]);
    }

    download(binaryText, "Test.stl");
}
reader.readAsArrayBuffer(input_field.files[0]);

1 个答案:

答案 0 :(得分:3)

将文件读取为ArrayBuffer后,内容将采用二进制格式(作为原始字节数组)。

这一行:

binaryText += String.fromCharCode(bytes[index]);
然而,

可能会搞乱,因为ASCII范围(0-127)之外的任何值都受16位unicode编码(UTF-16 / USC-2)的影响,并且原始字节可能最终使用两个字符来表示来源价值。

例如,您可以看到第一个差异出现在位置0x55,字节值0xB3(十进制为179)和ASCII范围之外,变为0xC2B3。下一个值0xEF(十进制239)变为0xC3AF,然后保持下一个0x3E,因为它是&lt; 128,等等。

但是,没有充分的理由通过此转换步骤,因为数据已经是二进制格式。可以(并且应该)删除整个循环。

只需将一个视图分配给ArrayBuffer(就像在转换步骤之前一样)并使用它来通过索引/位置读取数据。

如果您打算解析格式,我建议使用DataView而不是Uint8Array,因为文件倾向于定义数据字段的可变宽度,并且DataView在这些情况下更灵活,更方便。

如果要转移到服务器/商店进行下载,您只需保留原始文件blob并按原样发送(请参阅第一个test fiddle)。