前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库Blob 转 ArrayBuffer 的 API 方法
JavaScript数据处理

怎么把 Blob 转成 ArrayBuffer,有哪些 API 可以用?

现代浏览器直接 await blob.arrayBuffer(),它返回一个 Promise,读完得到 ArrayBuffer。要兼容老浏览器就用 FileReader 的 readAsArrayBuffer,它是事件风格的,结果要在 load 事件里从 reader.result 取。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#数据处理#异步编程
先看核心答案读代码示例
理解线索

两种读取方式

  1. blob.arrayBuffer()返回 Promise,失败时 reject,可以直接 try...catch
  2. FileReaderreadAsArrayBuffer 不返回数据,结果在 load 事件里
  3. blob.stream()一块一块地读,不用一次性把整个文件放进内存

Blob 本身不可修改。读出来的 ArrayBuffer 是一份新的内存,改它不会影响原来的 Blob。

核心回答

先记住这个答案

现代浏览器里最简单的写法是 const buffer = await blob.arrayBuffer()。arrayBuffer() 是 Blob 自带的方法,返回一个 Promise,读取完成后得到 ArrayBuffer,出错时 Promise 会 reject,可以直接用 try...catch 处理。需要兼容老浏览器时用 FileReader:调用 reader.readAsArrayBuffer(blob) 开始读,在 load 事件里通过 reader.result 拿结果,失败走 error 事件。两种方式都会把整个 Blob 读进内存,大文件要改用 blob.stream() 或者 slice 分片读取。

  • 首选 await blob.arrayBuffer()
  • FileReader 要监听 load 和 error 事件
  • 两种方式都会把整个文件读进内存
  • 大文件用 blob.stream() 或 slice 分片读

首选写法:blob.arrayBuffer()

拿到 ArrayBuffer 后,要用 Uint8Array 这类视图才能看到具体字节。

读取并查看字节JavaScript
async function inspectBlob(blob) {
  const buffer = await blob.arrayBuffer()   // 读完整个 Blob
  const bytes = new Uint8Array(buffer)      // 用视图查看字节
  return { size: buffer.byteLength, bytes: [...bytes] }
}

const blob = new Blob(['Hi'], { type: 'text/plain;charset=utf-8' })
inspectBlob(blob).then(result => console.log(result))
// { size: 2, bytes: [72, 105] }

'Hi' 按 UTF-8 编码是两个字节,72 和 105,所以 byteLength 是 2。忘写 await 是最常见的错误,这时 buffer 是一个 Promise,传给 new Uint8Array 会得到一个长度为 0 的数组,不会报错,很难发现。 读出来的是一份新内存,修改 bytes 不会改变原来的 blob,因为 Blob 本身是不可修改的。

兼容写法:FileReader 封装成 Promise

FileReader 是早期的读取接口,所有浏览器都支持。它不直接返回数据,要监听事件,所以一般封装成 Promise 再用。

处理成功和失败两条路径JavaScript
function readAsArrayBuffer(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onload = () => resolve(reader.result)   // 读取成功,result 是 ArrayBuffer
    reader.onerror = () => reject(reader.error)    // 读取失败
    reader.onabort = () => reject(new Error('读取被取消'))
    reader.readAsArrayBuffer(blob)
  })
}

load、error、abort 三个事件都要处理,漏掉 error 的话,读取失败时 Promise 永远不会结束。reader.result 的类型取决于调用了哪个读取方法:readAsArrayBuffer 得到 ArrayBuffer,用 readAsText 得到字符串,用 readAsDataURL 得到 data: 开头的字符串,读完之前它是 null。

回答前,多想一步

容易答错的地方

大文件也直接 arrayBuffer()
几个 GB 的视频一次性读成 ArrayBuffer,内存会瞬间飙升,页面可能直接崩溃。上传或处理大文件时,用 blob.slice(start, end) 切成小块逐块读,或者用 blob.stream() 拿到一个 ReadableStream,边读边处理。
以为读出来的 ArrayBuffer 和 Blob 共享内存
arrayBuffer() 每次都返回一份新的内存。修改它不会影响 Blob,想得到修改后的 Blob,要用 new Blob([buffer]) 重新创建。
试着用自己的话回答

面试官还会怎么问?

只想拿文本内容,也要先转 ArrayBuffer 吗?

不用。await blob.text() 直接按 UTF-8 解码成字符串。只有需要用其他编码解码,比如 GBK,或者要检查原始字节、解析二进制格式时,才先转 ArrayBuffer 再用 TextDecoder 或 DataView 处理。

怎样读取文件的前几个字节判断文件类型?

先 blob.slice(0, 4) 切出前 4 个字节,再对这一小块调用 arrayBuffer(),不会读整个文件。PNG 文件的前 4 个字节是 89 50 4E 47。但这只能用于前端提示,服务端还是要重新校验。

fetch 拿到的响应怎么转成 ArrayBuffer?

Response 对象也有 arrayBuffer() 方法,直接 await response.arrayBuffer()。也可以先 await response.blob() 得到 Blob,再按上面的方法处理。

从一道题,走向一组知识

把知识连起来

数据处理

Blob、File、ArrayBuffer 和 TypedArray 之间是什么关系?

File 继承自 Blob,所以这里的读取方法对用户选择的文件同样适用。

数据处理

解析二进制协议时,为什么要用 DataView 而不是 Uint16Array?

拿到 ArrayBuffer 后要按协议解析二进制格式,就要用 DataView 并注意字节序。

参考资料

  • JavaScript:数据处理参考资料
  • MDN:FileReader.readAsArrayBuffer()

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 首选写法:blob.arrayBuffer()
  3. 兼容写法:FileReader 封装成 Promise
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑