exa_simple_uploader.go 2.5 KB
Newer Older
1 2 3
package service

import (
Mr.奇淼('s avatar
Mr.奇淼( 已提交
4
	"errors"
5 6 7
	"fmt"
	"gin-vue-admin/global"
	"gin-vue-admin/model"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
8
	"gorm.io/gorm"
9 10 11 12 13
	"io/ioutil"
	"os"
	"strconv"
)

m0_50812349's avatar
m0_50812349 已提交
14 15 16 17 18 19
//@author: [piexlmax](https://github.com/piexlmax)
//@function: SaveChunk
//@description: 保存文件切片路径
//@param: uploader model.ExaSimpleUploader
//@return: err error

20 21 22 23
func SaveChunk(uploader model.ExaSimpleUploader) (err error) {
	return global.GVA_DB.Create(uploader).Error
}

m0_50812349's avatar
m0_50812349 已提交
24 25 26 27 28 29
//@author: [piexlmax](https://github.com/piexlmax)
//@function: CheckFileMd5
//@description: 检查文件是否已经上传过
//@param: md5 string
//@return: err error, uploads []model.ExaSimpleUploader, isDone bool

30 31
func CheckFileMd5(md5 string) (err error, uploads []model.ExaSimpleUploader, isDone bool) {
	err = global.GVA_DB.Find(&uploads, "identifier = ? AND is_done = ?", md5, false).Error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
32
	isDone = errors.Is(global.GVA_DB.First(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, true).Error, gorm.ErrRecordNotFound)
33 34 35
	return err, uploads, !isDone
}

m0_50812349's avatar
m0_50812349 已提交
36 37 38 39 40 41
//@author: [piexlmax](https://github.com/piexlmax)
//@function: MergeFileMd5
//@description: 合并文件
//@param: md5 string, fileName string
//@return: err error

42 43 44 45
func MergeFileMd5(md5 string, fileName string) (err error) {
	finishDir := "./finish/"
	dir := "./chunk/" + md5
	//如果文件上传成功 不做后续操作 通知成功即可
46
	if !errors.Is(global.GVA_DB.First(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, true).Error, gorm.ErrRecordNotFound) {
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
		return nil
	}

	//打开切片文件夹
	rd, err := ioutil.ReadDir(dir)
	_ = os.MkdirAll(finishDir, os.ModePerm)
	//创建目标文件
	fd, _ := os.OpenFile(finishDir+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
	//将切片文件按照顺序写入
	for k := range rd {
		content, _ := ioutil.ReadFile(dir + "/" + fileName + strconv.Itoa(k+1))
		_, err = fd.Write(content)
		if err != nil {
			_ = os.Remove(finishDir + fileName)
		}
	}
	//关闭文件
	defer fd.Close()

	if err != nil {
		return err
	}
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
		//删除切片信息
		if err = tx.Delete(&model.ExaSimpleUploader{}, "identifier = ? AND is_done = ?", md5, false).Error; err != nil {
			fmt.Println(err)
			return err
		}
		data := model.ExaSimpleUploader{
			Identifier: md5,
			IsDone:     true,
			FilePath:   finishDir + fileName,
			Filename:   fileName,
		}
		// 添加文件信息
		if err = tx.Create(&data).Error; err != nil {
			fmt.Println(err)
			return err
		}
		return nil
	})

	err = os.RemoveAll(dir) //清除切片
	return err
91
}