Тег объекта HTML5 с содержимым данных base64 приводит к сбою Chrome

#html #google-chrome #filereader

#HTML #google-chrome #filereader

Вопрос:

Я использую программу чтения файлов HTML5 для чтения локального файла. Затем я хочу немедленно отобразить содержимое файла в браузере перед загрузкой на сервер.

Я читаю файл и пытаюсь отобразить его следующим образом:

 var reader = new FileReader();
    reader.onloadend = function () {
        _moleculefilestream = reader.resu<
        _molecule.filename = filelist[0].name;
        var filetype = _molecule.filename.substring(_molecule.filename.length - 3);
        var html = '';
        if (filetype == 'jpg' || filetype == 'gif' || filetype == 'png' || filetype == 'tif' || filetype == 'bmp') {
            html  = '<img src="'   reader.result   '" />';
        }
        else {
            html  = '<object id="zzzxxx" data="'   reader.result   '"';
            if (filetype.toLowerCase() == 'pdf') {
                // For pdf docs, specify a height and width
                html  = ' width="770" height="350"';
            }
            html  = '>';
            html  = '</object>';
        }
        alert('we get here fine');
        $('#molecule-docviewer').html(html);
        alert('we have crashed by this point');
        MarkMoleculeAsDirty();
    }
    reader.readAsDataURL(filelist[0]); 
 

Когда я загружаю PDF-файл размером около 1,5 Мб в Chrome, все работает нормально. Когда я пытаюсь загрузить файл размером 1,5 Мб или больше, Chrome (V15) выходит из строя с сообщением «aw snap». Он отображает сообщение «мы добрались сюда нормально», но вылетает в следующей строке.

У кого-нибудь есть какие-нибудь яркие идеи о том, как это исправить или обойти? Спасибо.

Комментарии:

1. Я предлагаю вам отправить это в Chromium issue tracker и попросить помощи там — возможно, разработчики знают лучше

2. То же самое происходит и со мной, похоже, это связано с механизмом рендеринга. Вы случайно не отправили сообщение об ошибке команде разработчиков Chromium?

Ответ №1:

Вам следует рассмотреть возможность использования URL-адреса большого двоичного объекта вместо URL-адреса данных. На самом деле вы не манипулируете байтами файла, поэтому нет причин считывать весь файл в память, а затем добавлять 33% накладных расходов на base64, кодируя его как URL-адрес данных.

 window.URL = window.URL || window.webkitURL;

var file = filelist[0];
var url = window.URL.createObjectURL(file);
var html = '';
if (file.type amp;amp; file.type.match('image/.*')) {
  html  = '<img src="'   url   '" />';
}
....
 

Комментарии:

1. не забудьте проверить совместимость браузера с этими функциями developer.mozilla.org/en-US/docs/Web/API /…

2. Вы, сэр, бог среди людей JS! :-*