Golang 文件服务器支持多线程上传下载

hwholiday · · 1019 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

# 简介 参照 Telegram [Uploading and Downloading Files](https://core.telegram.org/api/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) ``` 返回 - 文件信息 ## 对外方法 ```bash //申请上传文件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 ## [完整代码示例](https://github.com/hwholiday/file_storage)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1019 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传