0Pricing
JavaScript Academy · 课时

使用 FileReader 读取文件

将选中的文件读取为文本或数据 URL。

使用 FileReader 读取文件 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。

什么是 FileReader

FileReader 是一种浏览器接口,可以异步读取 File 和 Blob 对象的内容。您可以从 <input type="file"> 获取文件,并将其读取为文本、数据 URL 或二进制数据。

从输入项获取文件

文件输入控件会提供一个 files 列表。第一个选中的文件位于索引 0 处,并具有 name、size 和 type 等有用属性。

const input = document.querySelector('#picker');
const file = input.files[0];

console.log(file.name);
console.log(file.size);
console.log(file.type);

读取是异步的

FileReader 不会直接返回数据。您需要附加一个 onload 处理程序,然后调用读取方法。结果稍后会出现在 reader.result 中。

const reader = new FileReader();
reader.onload = function () {
  console.log('done reading');
  console.log(reader.result);
};
reader.readAsText(file);

readAsText

readAsText 会将文件解码为文本字符串,非常适合读取 .txt、.csv 或 JSON 文件。

const reader = new FileReader();
reader.onload = () => {
  console.log('contents:', reader.result);
};
reader.readAsText(textFile);

readAsDataURL

readAsDataURL 会生成一个 base64 编码的 data: URL。将它赋给 img.src 后,就可以轻松预览图像。

const reader = new FileReader();
reader.onload = () => {
  const img = document.querySelector('#preview');
  img.src = reader.result;
  console.log(reader.result.slice(0, 30));
};
reader.readAsDataURL(imageFile);

readAsArrayBuffer

readAsArrayBuffer 会将原始二进制数据作为 ArrayBuffer 返回,适合逐字节解析文件格式。

const reader = new FileReader();
reader.onload = () => {
  const bytes = new Uint8Array(reader.result);
  console.log('byte count:', bytes.length);
  console.log('first byte:', bytes[0]);
};
reader.readAsArrayBuffer(binaryFile);

处理错误

附加一个 onerror 处理程序来捕获读取失败的情况,例如文件无法读取时。

const reader = new FileReader();
reader.onerror = () => {
  console.log('read failed:', reader.error.name);
};
reader.onload = () => console.log('ok');
reader.readAsText(file);

跟踪进度

对于大型文件,onprogress 事件会报告目前已加载的 bytes 数量,这对于制作进度条很有用。

const reader = new FileReader();
reader.onprogress = (event) => {
  if (event.lengthComputable) {
    const percent = (event.loaded / event.total) * 100;
    console.log('loaded ' + percent.toFixed(0) + '%');
  }
};
reader.readAsArrayBuffer(bigFile);

封装在 Promise 中

基于事件的接口使用起来不够简洁。将它封装在 Promise 中,这样就可以使用 await 编写更清晰的代码。

function readText(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = () => reject(reader.error);
    reader.readAsText(file);
  });
}

readText(file).then(text => console.log(text));

现代替代方案:file.text()

现代浏览器允许您直接调用 file.text()、file.arrayBuffer() 或 file.stream(),它们会返回 Promise。在许多情况下,这些方法比 FileReader 更简单。

async function show(file) {
  const text = await file.text();
  console.log(text);
}

show(file);

FileReader 为什么重要

借助 FileReader,您可以完全在浏览器中处理用户选中的文件:预览图像、解析 CSV,或在发送前验证上传内容。请根据所需数据选择读取方法:文本、数据 URL 或二进制数据。接下来,您将探索二进制大对象和对象 URL。

const reader = new FileReader();
reader.onload = () => console.log('ready to upload');
reader.readAsDataURL(file);

快速检查

哪个 FileReader 方法会返回适合图像预览 src 的 base64 字符串?

回顾:读取文件

您已经学会了如何读取文件内容:

  • 从 input.files 获取文件;通过 onload 异步读取。
  • readAsText、readAsDataURL 和 readAsArrayBuffer 会返回不同的格式。
  • 处理 onerror 和 onprogress,提高程序的健壮性。
  • 现代的 file.text() 和 file.arrayBuffer() 是基于 Promise 的替代方案。

常见问题解答

「使用 FileReader 读取文件」课时是免费的吗?

是的 — 「使用 FileReader 读取文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。

「使用 FileReader 读取文件」这节课中我会学到什么?

将选中的文件读取为文本或数据 URL。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 FileReader 读取文件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. FormData 对象
  2. 使用 FileReader 读取文件
  3. Blob 与对象 URL
  4. 使用 Fetch 上传文件
← 返回 JavaScript Academy