任务一完成
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
breakpointDir = "./breakpointDir/"
|
||||
finishDir = "./fileDir/"
|
||||
)
|
||||
|
||||
// BreakPointContinue 断点续传
|
||||
// content: 文件片段内容
|
||||
// fileName: 文件名
|
||||
// contentNumber: 当前片段序号
|
||||
// contentTotal: 总片段数
|
||||
// fileMd5: 文件MD5
|
||||
func BreakPointContinue(content []byte, fileName string, contentNumber int, contentTotal int, fileMd5 string) (string, error) {
|
||||
path := breakpointDir + fileMd5 + "/"
|
||||
err := os.MkdirAll(path, os.ModePerm)
|
||||
if err != nil {
|
||||
return path, err
|
||||
}
|
||||
pathC, err := makeFileContent(content, fileName, path, contentNumber)
|
||||
return pathC, err
|
||||
}
|
||||
|
||||
// CheckMd5 检查Md5
|
||||
func CheckMd5(content []byte, chunkMd5 string) bool {
|
||||
fileMd5 := MD5V(content)
|
||||
return fileMd5 == chunkMd5
|
||||
}
|
||||
|
||||
// makeFileContent 创建切片内容
|
||||
func makeFileContent(content []byte, fileName string, FileDir string, contentNumber int) (string, error) {
|
||||
if strings.Contains(fileName, "..") || strings.Contains(FileDir, "..") {
|
||||
return "", errors.New("文件名或路径不合法")
|
||||
}
|
||||
path := FileDir + fileName + "_" + strconv.Itoa(contentNumber)
|
||||
f, err := os.Create(path)
|
||||
if err != nil {
|
||||
return path, err
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = f.Write(content)
|
||||
if err != nil {
|
||||
return path, err
|
||||
}
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// MakeFile 合并切片文件
|
||||
func MakeFile(fileName string, FileMd5 string) (string, error) {
|
||||
rd, err := os.ReadDir(breakpointDir + FileMd5)
|
||||
if err != nil {
|
||||
return finishDir + fileName, err
|
||||
}
|
||||
_ = os.MkdirAll(finishDir, os.ModePerm)
|
||||
fd, err := os.OpenFile(finishDir+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o644)
|
||||
if err != nil {
|
||||
return finishDir + fileName, err
|
||||
}
|
||||
defer fd.Close()
|
||||
for k := range rd {
|
||||
content, _ := os.ReadFile(breakpointDir + FileMd5 + "/" + fileName + "_" + strconv.Itoa(k))
|
||||
_, err = fd.Write(content)
|
||||
if err != nil {
|
||||
_ = os.Remove(finishDir + fileName)
|
||||
return finishDir + fileName, err
|
||||
}
|
||||
}
|
||||
return finishDir + fileName, nil
|
||||
}
|
||||
|
||||
// RemoveChunk 移除切片
|
||||
func RemoveChunk(FileMd5 string) error {
|
||||
return os.RemoveAll(breakpointDir + FileMd5)
|
||||
}
|
||||
|
||||
// GetBreakpointDir 获取断点续传目录
|
||||
func GetBreakpointDir() string {
|
||||
return breakpointDir
|
||||
}
|
||||
|
||||
// GetFinishDir 获取完成文件目录
|
||||
func GetFinishDir() string {
|
||||
return finishDir
|
||||
}
|
||||
Reference in New Issue
Block a user