FileReader:result 属性

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

FileReader 接口的只读属性 result 返回文件的内容。此属性仅在读取操作完成后才有效,数据格式取决于用于启动读取操作的方法。

根据用于启动读取操作的读取方法,返回一个合适的字符串或 ArrayBuffer。如果读取尚未完成或不成功,则值为 null

结果类型描述如下。

方法 描述
readAsArrayBuffer() result 是一个包含二进制数据的 JavaScript ArrayBuffer
readAsBinaryString() result 在字符串中包含来自文件的原始二进制数据。
readAsDataURL() result 是一个包含表示文件数据的 data: URL 的字符串。
readAsText() result 是字符串形式的文本。

示例

此示例演示了一个函数 reader(),该函数从 文件输入中读取文件。它通过创建一个 FileReader 对象并创建一个 load 事件的监听器来实现,以便在文件读取完成后,获取 result 并将其传递给提供给 reader() 的回调函数。

内容被作为原始文本数据处理。

js
// Given this HTMLInputElement of type="file":
// <input id="image" type="file" accept="image/*">

function reader(file, callback) {
  const fr = new FileReader();
  fr.onload = () => callback(null, fr.result);
  fr.onerror = (err) => callback(err);
  fr.readAsDataURL(file);
}

document.querySelector("#image").addEventListener("change", (evt) => {
  // No files, do nothing.
  if (!evt.target.files) {
    return;
  }
  reader(evt.target.files[0], (err, res) => {
    console.log(res); // Base64 `data:image/...` String result.
  });
});

鉴于 FileReader 的异步性质,您可以使用基于 Promise 的方法。以下是一个用于带有 multiple 属性的 文件输入 的示例,它返回一个 Promise

js
// Given this HTMLInputElement:
// <input id="images" type="file" accept="image/*" multiple>

const reader = (file) =>
  new Promise((resolve, reject) => {
    const fr = new FileReader();
    fr.onload = () => resolve(fr);
    fr.onerror = (err) => reject(err);
    fr.readAsDataURL(file);
  });

async function logImagesData(fileList) {
  let fileResults = [];
  const frPromises = fileList.map(reader);

  try {
    fileResults = await Promise.all(frPromises);
  } catch (err) {
    // In this specific case, Promise.all() might be preferred
    // over Promise.allSettled(), since it isn't trivial to modify
    // a FileList to a subset of files of what the user initially
    // selected. Therefore, let's just stash the entire operation.
    console.error(err);
    return;
  }

  fileResults.forEach((fr) => {
    console.log(fr.result); // Base64 `data:image/...` String result.
  });
}

// HTMLInputElement type="file" Event handler:
document.querySelector("#images").addEventListener("change", (evt) => {
  // If no files, do nothing.
  if (!evt.target.files) {
    return;
  }
  logImagesData([...evt.target.files]);
});

规范

规范
File API
# dom-filereader-result

浏览器兼容性

另见