【问题标题】:Alternative to readAsBinaryString for IE10IE10 的 readAsBinaryString 的替代方案
【发布时间】:2013-09-06 02:51:27
【问题描述】:

IE10似乎不支持readAsBinaryString这个JavaScript FileReader对象的方法。按照this HTML5 Rocks article 中的建议,我尝试了以下方法:

String.fromCharCode.apply(null, new Uint16Array(buffer));

但是,这会导致 Out of stack space 错误。

【问题讨论】:

    标签: javascript html internet-explorer-10 filereader


    【解决方案1】:

    我找到了答案here

    var binary = "";
    var bytes = new Uint8Array(buffer);
    var length = bytes.byteLength;
    for (var i = 0; i < length; i++) {
      binary += String.fromCharCode(bytes[i]);
    }
    

    【讨论】:

    • 谢谢你,大卫。我尝试在代码中输入此内容,但出现错误ReferenceError: UInt8Array is not defined。片刻之后,我意识到这个类型是违反直觉地命名为Uint8Array 而不是UInt8Array - 注意小写的“i”。糟糕的开发商!好伤心!
    【解决方案2】:

    根据大卫琼斯的回答,我写了这个方法。 try/catch 处理 IE10/11 中的 readAsBinaryString 异常,并称自己为“IE模式”:

    function readBinaryStringFromBlob(blob, callback, ie) {
        var reader = new FileReader();
        if(!ie) {
            reader.addEventListener("loadend", function () {
                callback(reader.result);
            });
            try {
                reader.readAsBinaryString(blob);
            } catch (err) {
                readBinaryStringFromBlob(blob, callback, true);
            }
        } else {
            reader.addEventListener("loadend", function () {
                var binary = "";
                var bytes = new Uint8Array(reader.result);
                var length = bytes.byteLength;
                for (var i = 0; i < length; i++) {
                    binary += String.fromCharCode(bytes[i]);
                }
                callback(binary);
            });
            reader.readAsArrayBuffer(blob);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果你想要一些更简洁和 ES2015-ier 的东西,那么这可能就是你所追求的:

        const reader = new FileReader();
        reader.onerror = e => alert("File cannot be opened");
      
        if (reader.readAsBinaryString) {
           reader.onload = e => alert(e.target.result));
           reader.readAsBinaryString(file);
        }
        else {
           // Catering for IE 10/11
           reader.onload = e => {
              const bytes = new Uint8Array(e.target.result);
              const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), "");
              alert(binary);
           };
           reader.readAsArrayBuffer(file);
        }
      

      【讨论】:

        【解决方案4】:

        试试我的代码:

            function readAsBinaryString(blob, callback) {
                var reader = new FileReader();
        
                var binStringCallback = function (e) {
                    callback(e.target.result);
                };
        
                var arrBufferCallback = function (e) {
                    var binary = "";
                    var bytes = new Uint8Array(e.target.result);
                    var length = bytes.byteLength;
                    for (var i = 0; i < length; i++) {
                        binary += String.fromCharCode(bytes[i]);
                    }
                    callback(binary);
                };
        
                reader.onerror = reader.onabort = function () {
                    callback(null)
                };
        
                if (typeof reader.readAsBinaryString != "undefined") {
                    reader.onload = binStringCallback;
                    reader.readAsBinaryString(blob);
                } else {
                    reader.onload = arrBufferCallback;
                    reader.readAsArrayBuffer(blob);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-03
          • 2015-09-25
          • 2019-12-16
          • 2011-06-20
          • 2015-11-03
          • 2014-04-03
          • 2011-12-13
          • 2014-02-28
          相关资源
          最近更新 更多