
Chrome 75 中 File.arrayBuffer() 尚未实现,调用会报错“not a function”;需改用 FileReader.readAsArrayBuffer() 配合回调方式读取文件为 ArrayBuffer。
chrome 75 中 `file.arraybuffer()` 尚未实现,调用会报错“not a function”;需改用 `filereader.readasarraybuffer()` 配合回调方式读取文件为 arraybuffer。
在 Web 开发中,File.arrayBuffer() 是一个便捷的 Promise-based API,用于将 File 对象异步转换为 ArrayBuffer,广泛应用于 ZIP 打包、图像处理、音频解析等场景。然而,该方法属于较新的规范(源于 File API: Reading files),其浏览器兼容性有明确的时间线:Chrome 直到版本 76(2019年7月发布)才正式支持 File.arrayBuffer(),因此 Chrome 75 及更早版本中直接调用 f.arrayBuffer() 会导致 TypeError: f.arrayBuffer is not a function。
✅ 正确的兼容性写法(适用于 Chrome 75 及所有现代浏览器):
Array.from(file.files).forEach((f, i) => {
const reader = new FileReader();
reader.onload = function (e) {
// e.target.result 是 ArrayBuffer 类型,可直接传入 JSZip.file()
zip.file(f.webkitRelativePath || f.name, e.target.result);
};
reader.onerror = function () {
console.error(`Failed to read file: ${f.name}`);
};
reader.readAsArrayBuffer(f);
});⚠️ 注意事项:
- FileReader 是事件驱动、非 Promise 的传统 API,不支持 await;如需 Promise 化,可自行封装(见下方示例);
- f.webkitRelativePath 在部分环境下可能为 undefined(如拖拽根目录文件),建议降级使用 f.name 作为备选路径;
- 多文件并发读取时,每个 FileReader 实例必须独立创建(不可复用),否则 onload 回调易发生状态错乱;
- 若项目已使用 async/await 流程,推荐封装 Promise 版本以保持代码一致性:
function fileToArrayBuffer(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(reader.error);
reader.readAsArrayBuffer(file);
});
}
// 使用示例(需在 async 函数内)
for (const f of Array.from(file.files)) {
try {
const buffer = await fileToArrayBuffer(f);
zip.file(f.webkitRelativePath || f.name, buffer);
} catch (err) {
console.warn(`Skip file ${f.name}:`, err);
}
}? 总结:面对 Chrome 75 这类旧版浏览器,不应依赖 File.arrayBuffer(),而应采用稳定、广泛支持的 FileReader.readAsArrayBuffer() 方案。该方案不仅兼容性极佳(支持 IE10+、所有 Chromium/Firefox/Edge Legacy),且语义清晰、错误可控。在构建跨版本兼容的前端工具链时,建议通过特性检测(如 'arrayBuffer' in File.prototype)动态选择读取策略,兼顾简洁性与健壮性。

















