前言

文件存储是企业系统的基础能力。常见问题:

  • 大文件怎么上传。
  • 分片上传如何合并。
  • 秒传怎么实现。
  • 文件权限怎么控制。
  • 文件预览怎么做。
  • 存本地磁盘还是对象存储。

存储方案对比

方案 优点 缺点
本地磁盘 简单 扩容、备份、集群共享困难
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。

流程:

  1. 客户端计算文件 hash。
  2. 服务端查询是否已有相同 hash。
  3. 如果已有,直接创建用户文件引用。
  4. 如果没有,继续上传。

注意:

  • hash 相同不代表权限相同。
  • 秒传要区分物理文件和用户文件引用。

断点续传

断点续传依赖分片状态。

用户中断后再次上传:

  • 查询 uploadId 或文件 hash。
  • 返回已上传分片列表。
  • 客户端只补传缺失分片。

文件预览

常见方案:

  • 图片直接预览。
  • PDF 在线预览。
  • Office 转 PDF。
  • 视频转码。

预览通常要异步处理,避免上传接口阻塞。

权限控制

文件权限不能只靠 URL 隐藏。

常见方式:

  • 登录鉴权。
  • 文件 owner 校验。
  • 临时签名 URL。
  • 下载次数和有效期限制。
  • 敏感文件水印。

安全要求

企业文件上传还要考虑:

  • 文件类型白名单。
  • 文件大小限制。
  • 病毒扫描。
  • 路径穿越防护。
  • 内容安全审核。

高频面试题

大文件为什么要分片上传?

为了避免一次请求太大导致超时,也方便失败后只重传失败分片。

秒传的本质是什么?

用文件 hash 判断物理文件是否已存在,已存在则只创建引用关系。

为什么文件不建议直接存数据库?

大文件会增加数据库体积、备份成本和 IO 压力,影响核心业务数据。

对象存储 URL 泄漏怎么办?

使用临时签名 URL、权限校验、有效期控制和访问审计。

总结

文件存储场景的核心是:内容和元数据分离、大文件分片、秒传靠 hash、断点续传靠分片状态、权限靠服务端校验。企业文件系统还必须考虑预览、安全扫描、审计和对象存储成本。