go断点续传功能
断点续传功能,减少服务器文件重复存储. 提升上传响应速度
使用两种思路进行续传功能
注意: 文件使用文件名称进行唯一文件进行判断, 不具有文件唯一性.如果使用于生产环境. 需要处理文件上传文件名称问题
思路1:
思路1: 使用零时文件记录中断位置.
1.文件上传时,先创建上传一个新的文件
2.创建记录中断位置的临时文件
3.设置文件读写偏移量
4.上传完成后,删除临时文件
func upload1(r *http.Request) (int,error) {
// 获取上传文件
upfile, fileHeader, err := r.FormFile("file")
if err != nil {
return 0, errors.New("上传文件错误")
}
headerByte, _ := json.Marshal(fileHeader.Header)
log.Printf("当前文件:Filename - >{%s}, Size -> {%v}, FileHeader -> {%s}", fileHeader.Filename, fileHeader.Size, string(headerByte))
// 新文件创建
filePath := "./" + fileHeader.Filename
fileBool, err := isFileExists(filePath)
if fileBool && err == nil {
fmt.Println("文件已存在")
} else {
newfile, err := os.Create(filePath)
defer newfile.Close()
if err != nil {
return 0, errors.New("创建文件失败")
}
}
// 上传文件开始位置
start := "0"
// 查询本地是否有断点记录
var breakPointFile *os.File
breakPointFilePath := filePath + ".txt"
breakPointFileBool, err := isFileExists(breakPointFilePath)
// 如果文件存在 但断点记录不存在 则文件已上传
if fileBool && !breakPointFileBool {
return 0, errors.New("文件已存在, 不继续上传")
}
//fmt.Println("断点文件检测:", breakPointFileBool,err)
if breakPointFileBool && err == nil {
// 读取断点位置
breakPointFile, err = os.OpenFile(breakPointFilePath,os.O_CREATE|os.O_RDWR,os.ModePerm)
defer breakPointFile.Close()
if err != nil {
return 0, errors.New("断点文件打开失败")
}
res, _ := ioutil.ReadAll(breakPointFile)
fmt.Println("断点文件写入字段长度:",string(res))
start = string(res)
} else {
// 创建断点文件
breakPointFile ,err = os.Create(breakPointFilePath)
defer breakPointFile.Close()
if err != nil {
return 0, errors.New("断点文件创建失败")
}
len, err := breakPointFile.WriteString("0")
if len <= 0 || err != nil {
return 0, errors.New("