1.基于golang实现分布式文件上传服务
2.ceph和阿里云oss
3.支持断点续传和秒传功能
4.微服务化和容器部署
二、项目使用到的技术
redis
mysql
rabbitmq
docker部署微服务
ceph分布式存储
阿里云oss
三、收获干货
文件分块断点续传/秒传
对象从私有云迁移到阿里云oss的经验
四、项目进度
4.1 系统设计和搭建框架
接口列表
接口描述 | 接口url |
文件上传接口 | POST /file/upload |
文件查询接口 | GET /file/query |
文件下载接口 | GET /file/download |
文件删除接口 | POST /file/delete |
文件重命名接口 | POST /file/update |
这块的命令是可以进行优化的,增删改查是对应http restful api的
定义文件元信息的结构fileMeta
文件的唯一标识是什么?可用文件内容计算的md5值或sha1值作为文件名
4.2 文件上传功能
1.用户请求是HTTP GET,则返回上传页面
2.用户请求是HTTP Post,则解析form信息,生成fileMeta文件元信息
3.真实文件存储到本地磁盘,文件元信息(如文件名称,文件大小,文件sha1,存储位置,更新时间等)存储到mysql数据库中
4.上传成功后,http重定向到“上传成功页面”
4.3 文件下载功能
1.解析用户请求中的filehash值
2.根据filehash从mysql数据库中获取文件元信息
3.根据文件元信息中的文件位置FileLocation,读取文件内容返回给客户端
3.设置http的header头部,客户端接收到回应后才会当成是文件下载(而不是数据内容)
w.Header().Set("Content-Type", "application/octect-stream")
w.Header().Set("Content-Description", "attachment;filename=\""+fm.FileName+"\"")
4.4 获取及更新文件元信息
从mysql数据库获取文件元,以json形式返回给客户端
更新文件元信息,包括更改文件名,文件大小,文件路径
4.5 删除文件元信息
1.从Form表单中,解析出filehash值
2.根据filehash值,获取文件元信息
3.根据文件元信息,删除磁盘上的真实文件
4.从mysql数据库中删除该文件的信息
4.6 用户注册和登录功能
注册功能
1.获取Post请求中Form表单的用户名和密码
2.将密码+固定字符串经过sha1处理,加强安全性,即使数据库泄漏了,密码也不会泄漏
3.将用户名密码以及其他信息都写入到mysql数据库中
登录功能
1.解析用户请求中Form,得到用户名和密码
2.将密码和固定字符串进行sha1运算,得出加密后的密码
3.从mysql数据库中获取用户名和密码
4.两者对比,看是否符合