原创分享 Golang 文件服务器支持多线程上传下载

hwholiday · 2020年08月17日 · 317 次阅读

简介

参照 Telegram Uploading and Downloading Files
写的文件服务器(断点续传,分片上传下载,自动生成缩略图等)

申请上传文件

请求

  • 文件名
  • 文件大小 (字节)
  • 文件扩展名
  • 是否需要缩略图
  • 文件 MD5

返回

  • 文件 id
  • 上传过期时间,到时间未上传完,自动清理

取消上传文件

请求

  • 文件 ID

返回

  • 成功 or 失败

获取文件信息

请求

  • 文件 ID

返回

  • 文件信息

上传文件

请求

  • 文件 ID
  • 文件分片 ID file_part
  • 文件 MD5
  • 文件内容 part_size
  • 是否是最后一片 ###### 所有分片必须具有相同的大小(part_size),并且必须满足以下条件:part_size % 1024 = 0 (可被 1KB 整除 524288 % part_size = 0(512KB 必须可以被 part_size 整除)如果最后一部分的大小小于 part_size,则不必满足这些条件。每个部分都应具有序列号 file_part,其值的范围为 1 到 3000。

服务器处理

  • 每个分片接收完毕的时候都检查下服务器接受文件 MD5 是否相等
  • 检查该分片是否已经上传,是则不做任何处理,不是则把文件存入内存,再将已上传文件大小累加
  • 判断已上传文件大小是否等于文件总大小 (标记文件已经完成)
  • 按照文件分片顺序拼接文件
  • 检查文件 MD5 是否相等,上传到文件服务器,文件上传结束

返回

  • 成功 or 失败

下载文件

请求

  • 文件 ID
  • limit 可被 1024 整除
  • offset 可被 1024 整除
  • offset 不能超过 1048576(1 MB)

服务器处理

  • minio GetObject 可配置 bash var opt minio.GetObjectOptions err := opt.SetRange(start, end) GetObject(bucketName, fileName, opt)

返回

  • 文件信息

对外方法

//申请上传文件ID
ApplyFid(info *storage.InApplyFid) (out *storage.OutApplyFid, err error) 

//通过文件MD5获取服务器文件信息
GetPbFileInfoByMd5(md5 string) (fileInfo *storage.FileInfo, err error)

//通过文件ID获取服务器文件信息
GetPbFileInfoByFid(fid int64) (fileInfo *storage.FileInfo, err error)

//上传分片文件
UpSliceFile(in *storage.InUpSliceFileItem) (err error)

//分片下载文件
DownSliceFile(in *storage.InDownSliceFileItem) (out *storage.OutDownSliceFileItem, err error)

//上传不分片文件
UpFile(in *storage.InUpFile) (err error)

//下载不分片文件
GetFile(fid int64) (out *storage.OutDownFile, err error)

//取消上传
CancelByFid(info *storage.InCancelUpload) (err error)

联系 QQ: 3355168235

完整代码示例

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册