Я столкнулся с нечетной проблемой, используя FileReader.readAsArrayBuffer
, что только влияет на Firefox (я тестировал в текущей версии - v40). Я не могу сказать, делаю ли я что-то неправильно или это ошибка Firefox.Использование FileReader.readAsArrayBuffer() для измененных файлов в Firefox
У меня есть JavaScript, который использует readAsArrayBuffer
для чтения файла, указанного в поле <input>
. В нормальных условиях все работает правильно. Однако, если пользователь изменяет файл после его выбора в поле <input>
, readAsArrayBuffer
может сильно запутаться.
ArrayBuffer
Я возвращаюсь с readAsArrayBuffer
всегда имеет длину, из которой был первоначально создан файл. Если пользователь меняет файл, чтобы сделать его более крупным, я не получаю ни одного из байтов после исходного размера. Если пользователь меняет файл, чтобы сделать его меньше, буфер остается тем же размером, а «избыток» в буфере заполняется кодами символов 90 (заглавная буква «Z», если смотреть как строка).
Поскольку этот код настолько прост и отлично работает в каждом другом браузере, который я тестировал, я думаю, что это проблема с Firefox. У меня есть reported it as a bug для Firefox, но я хочу убедиться, что это не просто что-то очевидное. Я делаю неправильно.
Поведение может быть воспроизведено в следующем фрагменте кода. Все, что вам нужно сделать, это:
- Просмотр для текстового файла, который имеет 10 символов в нем (10 не магическое число - я просто использовать его в качестве примера)
- Заметим, что результат массив из 10 элементов, представляющих коды символов каждого элемента
- Пока он все еще запущен, удалите 5 символов из файла и сохраните
- Обратите внимание, что результат по-прежнему представляет собой массив из 10 элементов - первые 5 верны, но последние 5 - все 90 (прописная буква Z)
- Добавлено 10 символов (так что теперь файл составляет 15 символов cters длинные)
- Заметим, что результат по-прежнему массив из 10 элементов - 5 последних не возвращаются
function ReadFile() {
var input = document.getElementsByTagName("input")[0];
var output = document.getElementsByTagName("textarea")[0];
if (input.files.length === 0) {
output.value = 'No file selected';
window.setTimeout(ReadFile, 1000);
return;
}
var fr = new FileReader();
fr.onload = function() {
var data = fr.result;
var array = new Int8Array(data);
output.value = JSON.stringify(array, null, ' ');
window.setTimeout(ReadFile, 1000);
};
fr.readAsArrayBuffer(input.files[0]);
//These two methods work correctly
//fr.readAsText(input.files[0]);
//fr.readAsBinaryString(input.files[0]);
}
ReadFile();
<input type="file" />
<br/>
<textarea cols="80" rows="10"></textarea>
В случае, если фрагмент не работает, образец кода также доступен как JSFiddle здесь: https://jsfiddle.net/Lv5y9m2u/
Firefox может иметь проблемы с этим действительно ... При попытке загрузить скрипку разбился мой еженощно. Теперь это работает. – Oriol
@Oriol В рамках тестирования этого небольшого репродуктора и моего большего приложения, использующего эту логику, я столкнулся с множеством сбоев в Firefox. :-(Я не использую Firefox (за исключением проверки совместимости с кросс-браузером), поэтому я не был уверен, что Firefox просто глючит вообще, глючит с FileReader или что. _Не оскорбление, предназначенное для поклонников Firefox_ –
Возможно, связано с фактом что FF не обновляет «файлы» ввода, если имя одного и того же (нет события onchange) – Kaiido