Для «File Uploader» вы просто не должны использовать FileReader вообще.
Вам не нужно читать файл, чтобы иметь возможность загрузить его, Вы можете отправить его как BLOB-объект напрямую .
Если вам нужно отобразить его на текущей странице, вам все равно не нужен FileReader, создайте blobURI из Blob , который будет указывать непосредственно на файл на диске, снет бесполезного вздутия памяти.
inp.onchange = e => {
// yes that's all synchronous...
const url = URL.createObjectURL(inp.files[0]);
const img = new Image();
img.src = url;
document.body.appendChild(img);
};
<input type="file" id="inp" accept="image/*">
Единственный вариант использования FileReader - это когда вам необходим доступ к содержимому файла, например,
- Если вы хотите загрузить текстовый файл (или csv, или json) и проанализировать его, то вы будете использовать метод
readAsText()
. - если вы хотите прочитать / отредактировать некоторый двоичный файл (например, прочитать метаданные файла JPEG?), Тогда вы будете использовать
readAsArrayBuffer()
и работать из этого буфера. readAsDataURL()
, к сожалению, слишком часто используется неправильно. Как уже говорилось ранее, в 99% случаев то, что вы будете делать с этим dataURI, может быть сделано с blobURI или Blob напрямую.Единственный случай, который я вижу, это добавить двоичные данные в какой-то отдельный документ ... Или что-то, что не происходит каждый день на каждом сайте ... readAsBinaryString()
довольно бесполезно,и даже были удалены из стандартов.Если вам действительно нужно двоичное строковое представление вашего файла, вы можете сгенерировать его из ArrayBuffer, но что вы будете делать с этой строкой - загадка.(работать с ArrayBuffer напрямую).