🧑💻 面试官:几个 GB 的文件,网络断了一次,你让用户从头传吗?
🙋♂️ 我:可以把文件分片,记录已完成分片,恢复后只传缺的部分。
🧑💻 面试官:浏览器写着第 7 片已经完成,服务器却没有它,以谁为准?
🙋♂️ 我:以服务端确认的上传状态为准。
🧑💻 面试官:那用户给我一个已有文件的哈希,就能直接获得它?合并成功以后,文件是不是马上可以公开下载?
上传设计要抓住「可确认的进度与使用权限」。分片解决传输组织,续传解决进度恢复,秒传解决重复上传,但都不能替代鉴权和文件校验。
面试速答(60 秒版)
分片上传是把大文件拆成多个部分分别传输,便于控制单次失败成本和并发。服务端需要用上传会话、分片序号与校验信息组织它们,最后完成合并或对象存储提交。
断点续传是在中断以后,根据服务端确认的已完成分片继续传缺失部分。不能只相信浏览器本地进度,也要确认还是同一个文件、同一上传会话。
秒传是发现可复用内容后避免再次上传,但文件哈希只能用于匹配,不能证明用户有权限。需要文件归属、授权或适用的持有证明,不能让知道哈希的人直接拿走别人的文件。
最后还要校验大小、完整性和允许类型,处理失败会话与分片清理。上传完成、校验通过和可供业务使用,最好有明确状态。

知识点详解:文件变成很多片以后,怎样重新得到可靠结果?
先建立上传会话,再接收分片
服务端先确认用户身份、文件大小限制和目标位置,创建上传会话,例如一个 uploadId。
后续分片都绑定这个会话,带上分片序号、长度及必要校验信息。并发上传时,到达顺序可能不同,所以不能按“先收到的排前面”拼接。
重试同一片,也不能重复追加。服务端需要明确同一会话、同一序号是覆盖、拒绝,还是在校验一致时复用。
Amazon S3 分片上传说明展示了初始化、上传分片与完成提交的流程。自建系统也需要相应的状态与校验,不是仅在前端把数组切开。
续传恢复的是服务器承认的进度
假设浏览器已经发送了第 7 片,但收到响应前网络断开。它不知道服务器是否保存成功。
重新连接后,可以查询会话中已完成分片与对应校验信息,再决定重传哪些部分。只记录“前端已发送字节数”,可能把没保存的部分跳过去。
同时需要确认文件没有换。用户改了本地文件,文件名仍然相同,也不能接着旧会话传。可以结合文件大小、校验、版本等信息判断,但标识策略与完整性检查要说清楚。
如果使用对象存储,还需要保存它规定的分片编号与 ETag 等提交信息。multipart ETag 不应被一概当作整个文件的 MD5。

完成上传,不是简单把分片数量数一遍
服务端需要确认预期分片齐全、顺序正确,检查每片与整体的完整性,并根据方案提交为最终对象。
合并可能失败,完成请求也可能结果不确定。因此,重复完成请求应该能查询或返回已有结果,不生成多个重复业务文件。
可以把状态分成:
| 状态 | 表示什么 | 下一步 |
|---|---|---|
| 上传中 | 部分分片已确认 | 继续或恢复上传 |
| 待校验 | 内容已组装或完成提交 | 检查完整性与安全 |
| 可用 | 满足业务要求 | 在权限内引用文件 |
| 失败或过期 | 无法继续完成 | 保留原因并按规则清理 |
不是所有应用都需要完全相同的状态名,但“收到字节”与“允许使用”应该分清楚。
秒传为什么不能只凭哈希?
服务端发现某个哈希对应的文件已经存在,可以考虑复用存储内容。但知道哈希,不能证明用户拥有原文件,更不能证明他能读别人的附件。
一种常见思路,是把内容去重和用户文件记录分开。物理对象可以在内部复用,用户能看到什么、能下载什么,仍然通过授权关系决定。
对于需要验证用户确实持有内容的方案,还要设计适用的持有证明,并防止查询接口泄露敏感文件是否存在。不能把哈希当成下载口令。

文件安全和清理,要放进主流程
文件名和 Content-Type 都可能不可信。需要按场景限制类型、大小与数量,校验内容,避免可执行文件直接进入可执行目录。
OWASP 文件上传指南讨论了这些防护。必要的恶意内容检查、隔离与权限也不能因为采用对象存储就省掉。
未完成的会话和分片需要过期清理。清理时也要避免误删仍在继续的上传,可以使用明确状态、租期或条件更新。并发数和分片大小则通过网络条件、内存、服务成本与重试效果测量,不凭经验认定某个数字适合所有文件。
面试官继续追问
浏览器进度到了 100%,是不是已经上传成功?
不一定。可能只是字节发送完成,还没得到服务端确认,也可能正在合并或校验。UI 应展示实际阶段,而不是把发送进度当成最终结果。
秒传和断点续传有什么区别?
秒传复用已经存在且允许使用的内容,避免再次传;续传继续一个未完成的上传。它们解决不同阶段的问题。
可以直接把对象存储密钥给前端吗?
不能暴露长期、宽权限密钥。可以使用限定目标、有效期和权限的临时上传授权,并在完成阶段校验归属与结果。
面试速记卡
- 分片:组织大文件传输,失败时重试局部。
- 续传:根据服务端确认进度,继续同一文件和会话。
- 完成:检查分片与整体,结果不确定时可查询。
- 秒传:内容匹配不等于授权,哈希不是下载口令。
- 生命周期:上传、校验、可用与过期清理分别管理。
