Java面试要点:分片上传、秒传、断点续传、预览与权限控制
前言
文件存储是企业系统的基础能力。常见问题:
- 大文件怎么上传。
- 分片上传如何合并。
- 秒传怎么实现。
- 文件权限怎么控制。
- 文件预览怎么做。
- 存本地磁盘还是对象存储。
存储方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 本地磁盘 | 简单 | 扩容、备份、集群共享困难 |
| NFS/共享盘 | 多实例共享 | 性能和稳定性依赖存储 |
| 对象存储 | 扩展性强 | 依赖外部服务 |
| 数据库存 BLOB | 事务简单 | 数据库压力大,不推荐大文件 |
企业里更常见的是对象存储 + 元数据表。
元数据设计
文件表通常存:
- file_id。
- original_name。
- storage_key。
- size。
- md5。
- content_type。
- owner_id。
- permission。
- status。
文件内容放对象存储,数据库只存元数据。
分片上传
sequenceDiagram
participant C as 客户端
participant S as 文件服务
participant O as 对象存储
C->>S: 初始化上传
S-->>C: uploadId
C->>O: 上传分片1
C->>O: 上传分片2
C->>S: 通知合并
S->>O: 合并分片
S->>S: 保存文件元数据
核心点:
- uploadId 标识一次上传。
- 每个分片有序号和校验值。
- 服务端记录已上传分片。
- 合并前校验完整性。
秒传
秒传依赖文件摘要,例如 MD5 或 SHA-256。
流程:
- 客户端计算文件 hash。
- 服务端查询是否已有相同 hash。
- 如果已有,直接创建用户文件引用。
- 如果没有,继续上传。
注意:
- hash 相同不代表权限相同。
- 秒传要区分物理文件和用户文件引用。
断点续传
断点续传依赖分片状态。
用户中断后再次上传:
- 查询 uploadId 或文件 hash。
- 返回已上传分片列表。
- 客户端只补传缺失分片。
文件预览
常见方案:
- 图片直接预览。
- PDF 在线预览。
- Office 转 PDF。
- 视频转码。
预览通常要异步处理,避免上传接口阻塞。
权限控制
文件权限不能只靠 URL 隐藏。
常见方式:
- 登录鉴权。
- 文件 owner 校验。
- 临时签名 URL。
- 下载次数和有效期限制。
- 敏感文件水印。
安全要求
企业文件上传还要考虑:
- 文件类型白名单。
- 文件大小限制。
- 病毒扫描。
- 路径穿越防护。
- 内容安全审核。
高频面试题
大文件为什么要分片上传?
为了避免一次请求太大导致超时,也方便失败后只重传失败分片。
秒传的本质是什么?
用文件 hash 判断物理文件是否已存在,已存在则只创建引用关系。
为什么文件不建议直接存数据库?
大文件会增加数据库体积、备份成本和 IO 压力,影响核心业务数据。
对象存储 URL 泄漏怎么办?
使用临时签名 URL、权限校验、有效期控制和访问审计。
总结
文件存储场景的核心是:内容和元数据分离、大文件分片、秒传靠 hash、断点续传靠分片状态、权限靠服务端校验。企业文件系统还必须考虑预览、安全扫描、审计和对象存储成本。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Junly博客!
评论


