关于文件服设计的一些想法

文件服务器需要满足以下几点:


1 很多时候上传上去服务器的文件,在未点击保存按钮之前,该文件还未与业务关联(垃圾文件),这种文件需要 - 定时任务找出来并清除

2 上传文件接口做:鉴权(调用权限,不能谁都往里面塞文件)、限频、限制文件大小、限制文件类型,并良好的错误反馈(准确提供上传接口调用失败的原因)

3 下载文件要实现的:防止爬虫脚本拉取(鉴权 - 非常重要)、不可猜测拉取其他文件(不要文件访问标识用MySQL表主键那样有规律1、2、3的标识符号)、下载日志记录

4 与业务分离- 使用token的形式鉴权,独立运行,不会因为业务要更新导致文件服宕机

CREATE TABLE IF NOT EXISTS `common_file_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `file_origin_name` varchar(500) NOT NULL DEFAULT '' COMMENT '文件原名|hello.jpg',
  `file_basic_name` varchar(200) NOT NULL DEFAULT '' COMMENT '文件名|hello',
  `file_extend` varchar(30) NOT NULL DEFAULT '' COMMENT '文件扩展名|.jpg',
  `file_path` varchar(500) DEFAULT '' COMMENT '文件全路径|/data/hello.jpg',
  `file_size` varchar(500) DEFAULT '' COMMENT '文件大小|100',
  `file_type` varchar(500) DEFAULT '' COMMENT '文件类型|',
  `upload_time` datetime COMMENT '上传时间',
  `upload_user` varchar(50) DEFAULT '' COMMENT '上传人员',
  `business` varchar(50) DEFAULT '' COMMENT '关联业务',
  `business_hash` varchar(500) DEFAULT '' COMMENT '关联业务hash值',
  `memo` varchar(200) DEFAULT '' COMMENT '备注内容',
  `enable_flag` tinyint(1) unsigned DEFAULT 1,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='上传文件表' AUTO_INCREMENT=1;

现在需要实现2个接口:

A 文件上传接口(登录校验)

xxx.com/common/upload

B 文件访问接口 

xxx.com/common/download?business=assess&business_hash=123

文件访问接口不能以文件主表ID为访问依据,因为容易被猜测,爬虫爬取,一旦没有做好权限验证,就会被采集

getFile?id=1,2,3 ... 应当以hash值访问,php uniqid函数那种无规律的hash值

原文地址:https://www.cnblogs.com/xuweiqiang/p/13883778.html