E11上的JavaScript readAsBinaryString函数

Dev*_*.K. 23 javascript html5 internet-explorer

在此页面 http://www.html5rocks.com/en/tutorials/file/dndfiles/,如果您向下滚动到示例"示例:切片文件.试试吧!" 您将看到使用readAsBinaryString API读取本地文件的字节.

我见过IE(我的情况是IE11)不支持readAsBinaryString.

甚至在HTML5文件API中提到的此代码也会在IE11 中的readAsBinaryString读取为文本和二进制中断.

我在堆栈溢出中看到了一些帖子,它建议使用ReadAsArrayBuffer().但它也没有用.它返回undefined.

我的问题是如果我必须在IE11上运行它有什么选择?是否可以编写另一个IE兼容的JS函数,它将执行readAsBinaryString()的JOB.

Nai*_*gel 43

我将@Jack答案与我的评论结合起来,以展示一个完整的工作示例.

在本<head>节中,我添加了此脚本以FileReader.readAsBinaryString在IE11中添加功能

if (FileReader.prototype.readAsBinaryString === undefined) {
    FileReader.prototype.readAsBinaryString = function (fileData) {
        var binary = "";
        var pt = this;
        var reader = new FileReader();
        reader.onload = function (e) {
            var bytes = new Uint8Array(reader.result);
            var length = bytes.byteLength;
            for (var i = 0; i < length; i++) {
                binary += String.fromCharCode(bytes[i]);
            }
            //pt.result  - readonly so assign content to another property
            pt.content = binary;
            pt.onload(); // thanks to @Denis comment
        }
        reader.readAsArrayBuffer(fileData);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我需要稍微修改我的原始脚本代码,因为target.result在使用此回退功能时没有任何价值.

var reader = new FileReader();
reader.onload = function (e) {
    // ADDED CODE
    if (!e) {
        var data = reader.content;
    }
    else {
        var data = e.target.result;
    }

    // business code
};
reader.readAsBinaryString(myFile);
Run Code Online (Sandbox Code Playgroud)


小智 31

这是我的解决方案.

var reader = new FileReader();
reader.readAsBinaryString(fileData);
reader.onload = function(e) {
  if (reader.result) reader.content = reader.result;
  var base64Data = btoa(reader.content);
  //...
}
//extend FileReader
if (!FileReader.prototype.readAsBinaryString) {
    FileReader.prototype.readAsBinaryString = function (fileData) {
       var binary = "";
       var pt = this;
       var reader = new FileReader();      
       reader.onload = function (e) {
           var bytes = new Uint8Array(reader.result);
           var length = bytes.byteLength;
           for (var i = 0; i < length; i++) {
               binary += String.fromCharCode(bytes[i]);
           }
        //pt.result  - readonly so assign binary
        pt.content = binary;
        $(pt).trigger('onload');
    }
    reader.readAsArrayBuffer(fileData);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在主代码中我用这种方式使用`FileReader`:`var reader = new FileReader(); reader.onload = function(e){var data = e.target.result; ..CODE HERE ..}; reader.readAsBinaryString(MYFILE)`.我需要以这种方式改变`reader.onload`:`reader.onload = function(e){if(!e){var data = reader.content;} else {var data = e.target.result; } ..CODE HERE ..};` (4认同)
  • @Naigel评论对他写的改变很有帮助.结合Jacks代码和Naigels为我工作 (2认同)

ozd*_*fir 7

对于IE 11,您可以使用此XHR技巧:

function blobToBinaryStringIE11(blob) {
    var blobURL = URL.createObjectURL(blob);
    var xhr = new XMLHttpRequest;
    xhr.open("get", blobURL);
    xhr.overrideMimeType("text/plain; charset=x-user-defined");
    xhr.onload = function () {
        var binary = xhr.response;
        // do stuff
    };
    xhr.send();
}
Run Code Online (Sandbox Code Playgroud)

它比Uint8Array + fromCharCode路线快20倍,速度快readAsBinaryString.


Jay*_*ran 7

FileReader.readAsBinaryString 是一个非标准函数,已被弃用.

FileReader.readAsArrayBuffer 应该用来代替.

MDN