fetch 获取 arraybuffer 响应需显式调用 response.arraybuffer() 并 await,不可混用 text() 或 json();得到 arraybuffer 后可用 uint8array 视图操作字节,或 textdecoder 解码为字符串,注意不可重复调用解析方法且须处理跨域限制。

Fetch 获取 ArrayBuffer 响应时,需显式调用 response.arrayBuffer() 方法,并等待其返回的 Promise 解析。它不会自动转换,也不能像 JSON 或 text 那样直接用 await response.json() 处理。
明确设置响应类型为 arraybuffer
虽然 Fetch 默认能接收任意类型响应,但若后端返回的是二进制数据(如图片、音频、加密文件),建议在请求中不强制指定 Content-Type 请求头,而是关注响应的实际 MIME 类型。关键是调用正确的响应解析方法:
-
response.arrayBuffer()—— 返回 Promise - 不要混用
response.text()或response.json(),否则会抛错或得到乱码 - 如果已知是图片等资源,也可用
response.blob(),再转成 ArrayBuffer(blob.arrayBuffer())
正确读取和使用 ArrayBuffer
得到 ArrayBuffer 后,通常需要转为视图(如 Uint8Array)才能操作字节内容:
- 用
new Uint8Array(buffer)创建可读写的字节数组 - 若需字符串,可用
TextDecoder(注意编码,默认 UTF-8):new TextDecoder().decode(buffer) - 若处理图片,可结合
Blob和URL.createObjectURL()渲染到<img>
常见错误与避坑点
容易出错的地方集中在异步链和类型误判上:
- 忘记
await:必须const buffer = await response.arrayBuffer(),否则得到的是 Promise 对象而非实际 ArrayBuffer - 重复调用解析方法:同一个 response 只能调用一次
arrayBuffer(),再次调用会返回已 resolve 的 Promise,但底层流已消耗 - 跨域限制:若请求跨域且响应含敏感头(如自定义 header),需服务端设置
Access-Control-Expose-Headers,否则 JS 无法读取响应头信息
完整示例:下载并解析二进制文件
比如请求一个 .wasm 文件或加密密钥文件:
fetch('/data.bin')
.then(response => {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.arrayBuffer(); // 必须这一步
})
.then(buffer => {
const bytes = new Uint8Array(buffer);
console.log('前10字节:', bytes.slice(0, 10));
// 进一步处理:解密、校验、写入 IndexedDB 等
})
.catch(err => console.error('加载失败:', err));Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











