Подтвердить что ты не робот

JavaScript readAsBinaryString Функция на E11

На этой странице http://www.html5rocks.com/en/tutorials/file/dndfiles/, если вы перейдете к примеру "Пример: нарезка файла. Попробуйте!" вы увидите использование API readAsBinaryString для чтения байтов локальных файлов.

Я видел, что IE (My case its IE11) не поддерживает readAsBinaryString.

Даже этот код, упомянутый в post API файлов HTML5, который читается как текстовый и двоичный, разбивается на readAsBinaryString в IE11.

Я видел сообщение в переполнении стека, он предлагает использовать ReadAsArrayBuffer(). Но он также не работает. Он возвращает undefined.

Мой вопрос в том, каковы варианты, если я должен запустить его в IE11? Возможно ли написать другую совместимую с IE функцию JS, которая будет выполнять JOB readAsBinaryString().

4b9b3361

Ответ 1

Это мое решение.

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);
    }
}

Ответ 2

Я комбинирую ответ @Jack с моим комментарием, чтобы показать полный рабочий пример.

В разделе <head> я добавил этот script, чтобы добавить функцию 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);
    }
}

Затем мне нужно было немного изменить исходный код script, потому что 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);

Ответ 3

Для 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();
}

Он в 20 раз быстрее, чем маршрут Uint8Array + fromCharCode и работает так же быстро, как readAsBinaryString.

Ответ 4

Заменить

reader.readAsBinaryString(blob);

с:

reader.readAsText(blob);

он хорошо работает в кросс-браузере.

Ответ 5

FileReader.readAsBinaryString является нестандартной функцией и устарел.

FileReader.readAsArrayBuffer.

MDN