Я столкнулся с нечетной проблемой, используя FileReader.readAsArrayBuffer
, которая только влияет на Firefox (я тестировал в текущей версии - v40). Я не могу сказать, что я просто делаю что-то неправильно или это ошибка Firefox.
У меня есть JavaScript, который использует readAsArrayBuffer
для чтения файла, указанного в поле <input>
. В нормальных условиях все работает правильно. Однако, если пользователь изменяет файл после его выбора в поле <input>
, readAsArrayBuffer
может сильно запутаться.
ArrayBuffer
Я возвращаюсь из readAsArrayBuffer
, всегда имеет длину, из которой был первоначально создан файл. Если пользователь меняет файл, чтобы сделать его более крупным, я не получаю ни одного из байтов после исходного размера. Если пользователь меняет файл, чтобы сделать его меньше, буфер по-прежнему имеет тот же размер, а "лишний" в буфере заполняется кодами символов 90 (заглавная буква "Z", если смотреть как строка).
Поскольку этот код настолько прост и отлично работает в каждом другом браузере, который я тестировал, я думаю, что это проблема Firefox. Я сообщил об этом как об ошибке в Firefox, но я хочу убедиться, что это не просто что-то очевидное. Я делаю неправильно.
Поведение может быть воспроизведено в следующем фрагменте кода. Все, что вам нужно сделать, это:
- Найдите текстовый файл с 10 символами (10 не является магическим числом - я просто использую его в качестве примера)
- Обратите внимание, что результатом является массив из 10 элементов, представляющих коды символов каждого элемента.
- Пока это все еще выполняется, удалите 5 символов из файла и сохраните
- Обратите внимание, что результат по-прежнему представляет собой массив из 10 элементов: первые 5 верны, но последние 5 - все 90 (прописная буква Z)
- Теперь добавлено 10 символов (так что файл длиной 15 символов)
- Обратите внимание, что результат по-прежнему представляет собой массив из 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>