云储存时代的业务文件储存

简单文件信息的弊端

文件上传和业务提交分开的架构中,如何标记有效文件和无效文件,指:“已上传,但未绑定到业务”,例如著名的 “微博图床”插件 就是利用这一特性吸血新浪微博导致储存被滥用

仅储存文件url储存方案分析

  1. 如果文件名从url中获取,必须再增加一层uuid/md5的文件夹路径,不然就会重名替换了
  2. 如果文件类型从url后缀获取,也可以,但是对 url 稍微有点限制
  3. 要求url必须能反向查找到文件系统上的文件,否则没法凭url删除文件
  4. 只能从业务找到文件,无法从文件找到业务
  5. uri中的路径必须和文件系统的路径对应,如果出现路径字符不兼容就会有问题(例如windows和linux的文件名中的特殊字符支持不同)
  6. 一个文件绑定到A业务,如果A业务将文件URL传递给B业务,如何给文件继续添加绑定

完整的文件信息储存方案

文件信息files:

  1. 上传者ID uid
  2. 文件url url
  3. 储存 disk?
  4. 路径 dir
  5. 文件名 name
  6. 文件大小 size
  7. 是否图片 type?

文件业务关联表file_map:

  1. file_id
  2. bussiness_id
  3. bussiness_type
  4. timestamps

这样的结构的优势:

  1. 可以清理无关联的孤儿文件, 例如上传完文件但是未绑定到业务,或者根本就是滥用储存者上传的文件
  2. 可以防止超权限引用,例如一个用户能看到另一个用户的图片,然后复制了他的url来上传到自己的业务,用仅储存url方案,我们没办法禁止这种行为,但是用完整方案,就可以限定只可以为自己的业务绑定自己uid的文件
  3. 可以知道哪个用户在哪个业务上传的文件量,可以后置的防止储存滥用
  4. 可以在上传组件结合文件库组件来避免重复上传同一个文件,这对较多大文件上传的业务很有用
  5. 在需要删除文件时,清楚的知道影响了哪个业务的哪个数据,能避免不清楚影响范围而不敢删除任何一个文件的情况,即使不删除,只是将文件转移到备份型储存以节省成本也是很有用的
  6. 在需要删除业务的时候,可以删除业务关联的文件

这种方案不仅在于从各方面节省成本,更在于 不使信息丢失 ,例如文件本身的信息,例如文件名,上传者ID,和文件与业务的关联关系,两个文件是否是同一个文件的关系等

鄂ICP备14007840号-1