- 一个轻量级网盘
- 限速
- 断点续传
- 文件秒传
- 轻松权限管理 一键生成加密二维码
- 回收站系统,自动清理过期链接、删除文件
- Dockerfile进行docker部署
- Docker-compose模式部署
设计思路是每个哈希值不同的文件挂载在服务器,数据库存储所有文件的信息和用户与文件ID的映射
使用虚拟目录以减少系统开销
- 上传文件
fileGroup.POST("/upload", uploadfile)
上传文件 会从body的form-data中读取文件与父级虚拟目录
然后检查文件哈希值 与数据库中已有哈希对比 如果存在相同 直接秒传(直接在私人存储表添加一条记录 指向公共存储表中指定文件)
- 断点续传
fileGroup.POST("/uploadbysilce", uploadfilebysile)
基本流程如上 但是将from-data的文件copy到服务器本地路径时,会先生成一个临时文件,记录传输进度,下一次再上传时根据临时文件信息 使用seek即可实现断点续传
- 下载文件
fileGroup.GET("/download/:file_id", downloadfile)
先检查url确定该文件是否为分享,然后确认点击者权限,如果有权限可进行下载
如果点击者非VIP 速度会被限制到500KB
- 边下边播
fileGroup.GET("/downloadbysilce/:file_id", downloadbyslice)
基本流程与下载一致 但传输时会把链接升级为Websocket
然后分片传输
- 删除文件
fileGroup.DELETE("/delete/:file_id", deletefile)
删除文件是只针对数据库的操作,将用户私人表中的delete字段设置为删除日期即可,三十天内可找回,三十天后字段自动删除
- 恢复文件
fileGroup.GET("/recover/:file_id", recoverfile)
恢复文件同样是针对数据库的操作,将delete字段设置为空即可恢复(被删除的文件无法下载分享等))
- 文件改名
fileGroup.POST("/rename/:file_id", renamefile)
文件改名只改变用户私有库中文件名
- 文件路径修改
fileGroup.POST("/modify-path/:file_id", modifypath)
文件路径修改会修改用户私有库中father_path
字段,只改变虚拟路径,数据返回前段时即可根据父路径 显示某个路径下所有文件与文件夹
- 文件分享
fileGroup.POST("/share/:file_id", sharefile)
文件分享会生成一个二维码,它携带参数share=true&expr_time
分享字段和过期时间(天),在期限前点击链接即可一键入库,然后下载
- 加密分享
fileGroup.POST("/share/secret/:file_id", sharefilewithsecret)
会生成一个加密链接二维码
- 解密重定向链接
r.GET("/secret/:val", JWTAuthMiddleware(), RateLimitMiddleware(time.Millisecond*100, 2048), func(c *gin.Context)
加密的链接会有一个前缀,所有加密的链接都由这个接口处理,接口拿到密文后解密重定向
- 定时清理
通过cron定时任务,每日清理回收站过期与删除到期的记录
- [go中seek方法]:https://segmentfault.com/a/1190000041780358
- [go令牌桶算法]:https://www.liwenzhou.com/posts/Go/ratelimit/