分片上传预处理需避免全量读取:用 slice() 安全截取二进制片段,filereader 逐片读取后立即释放,同步生成基于内容的文件 id、基础元数据并缓存至 sessionstorage,同时规避移动端陷阱如 ios 点击失效、多选卡顿等。

直接用 FileReader 读整个大文件会卡死页面,甚至触发 iOS Safari 崩溃。分片上传前的预处理核心是:不加载全量、只切片读、读完即弃、边读边传。
一、用 slice() 安全截取二进制片段
File 对象原生支持 slice(start, end),返回新 Blob,不复制原始数据,内存零额外开销:
- start 和 end 单位是字节,不是字符或行数;例如 2MB 片:
file.slice(0, 2 * 1024 * 1024) - 切片大小建议 1–5 MB:太小增加 HTTP 次数,太大易超时或触发 Android WebView 内存警告
- iOS Safari 不支持
slice(start, end, contentType)第三个参数,统一省略更稳妥
二、用 FileReader 逐片读取并立即释放
每片用独立 FileReader 实例读取,读完立刻置 null,防 GC 堆积:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 不要复用同一个 FileReader,避免状态污染
- 读取后拿到
reader.result(ArrayBuffer),立刻传给上传逻辑,不缓存 - 读完马上执行
reader = null,尤其在循环分片中必须显式释放 - 避免调用
file.text()或file.arrayBuffer()等全量读方法——它们会把整个文件拉进内存
三、预处理阶段同步生成关键元数据
在用户选中文件后、点击上传前,就完成三项不可逆操作:
-
计算唯一文件 ID:基于内容而非文件名,用
SubtleCrypto.digest('SHA-256', chunkArrayBuffer)分片哈希聚合生成,支持秒传与断点续传 -
记录基础信息:保存
file.name、file.size、file.lastModified到上传请求体,供服务端校验 - 缓存 ID 到 sessionStorage:防止页面刷新后丢失标识,确保断点续传上下文连续
四、规避移动端常见陷阱
预处理阶段就要为真机环境兜底:
- 隐藏原生
<input type="file">,用按钮 +label或 JS click() 触发,解决 iOS Safari 点击失效问题 - 禁用多选预加载:用
event.target.files.item(0)或Array.from(files).slice(0, 1)只取首个文件,防 WebView 解析缩略图卡顿 - 不依赖
webkitRelativePath(Android WebView 多数不支持),改用服务端生成 upload_id 关联分片
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










