FileReader:result 属性

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

备注: 此特性在 Web Worker 中可用。

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

根据使用哪种读取方法来启动读取操作的适当的字符串或 ArrayBuffer 对象。如果读取尚未完成或不成功,则值为 null

结果类型如下所述。

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

示例

这个例子展示了一个函数 reader(),它从文件输入框读取文件。它的工作原理是创建一个 FileReader 对象并为 load 事件创建一个侦听器,这样当读取文件时,result 被获取并传递给提供给 reader() 的回调函数。

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

js
// 给定这个 type="file" 的 HTMLInputElement:
// <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) => {
  // 没有文件,什么也不做。
  if (!evt.target.files) {
    return;
  }
  reader(evt.target.files[0], (err, res) => {
    console.log(res); // Base64 `data:image/...` 字符串结果。
  });
});

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

js
// 给定这个 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) {
    // 在这种特定情况下,Promise.all() 可能优于 Promise.allSettled(),因为将 FileList 修改为用户最初选择的文件的子集并非易事。因此,让我们隐藏整个操作。
    console.error(err);
    return;
  }

  fileResults.forEach((fr) => {
    console.log(fr.result); // Base64 `data:image/...` 字符串结果。
  });
}

// HTMLInputElement type="file" 事件处理器:
document.querySelector("#images").addEventListener("change", (evt) => {
  // 没有文件,什么也不做。
  if (!evt.target.files) {
    return;
  }
  logImagesData([...evt.target.files]);
});

规范

Specification
File API
# dom-filereader-result

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
result

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见