package example import ( "errors" "gorm.io/gorm" "miniapp/global" "miniapp/model/example" ) type FileUploadAndDownloadService struct{} //@author: [piexlmax](https://github.com/piexlmax) //@function: FindOrCreateFile //@description: 上传文件时检测当前文件属性,如果没有文件则创建,有则返回文件的当前切片 //@param: fileMd5 string, fileName string, chunkTotal int //@return: file model.ExaFile, err error func (e *FileUploadAndDownloadService) FindOrCreateFile(fileMd5 string, fileName string, chunkTotal int) (file example.ExaFile, err error) { var cfile example.ExaFile cfile.FileMd5 = fileMd5 cfile.FileName = fileName cfile.ChunkTotal = chunkTotal if errors.Is(global.GVA_DB.Where("file_md5 = ? AND is_finish = ?", fileMd5, true).First(&file).Error, gorm.ErrRecordNotFound) { err = global.GVA_DB.Where("file_md5 = ? AND file_name = ?", fileMd5, fileName).Preload("ExaFileChunk").FirstOrCreate(&file, cfile).Error return file, err } cfile.IsFinish = true cfile.FilePath = file.FilePath err = global.GVA_DB.Create(&cfile).Error return cfile, err } //@author: [piexlmax](https://github.com/piexlmax) //@function: CreateFileChunk //@description: 创建文件切片记录 //@param: id uint, fileChunkPath string, fileChunkNumber int //@return: error func (e *FileUploadAndDownloadService) CreateFileChunk(id uint, fileChunkPath string, fileChunkNumber int) error { var chunk example.ExaFileChunk chunk.FileChunkPath = fileChunkPath chunk.ExaFileID = id chunk.FileChunkNumber = fileChunkNumber err := global.GVA_DB.Create(&chunk).Error return err } //@author: [piexlmax](https://github.com/piexlmax) //@function: DeleteFileChunk //@description: 删除文件切片记录 //@param: fileMd5 string, fileName string, filePath string //@return: error func (e *FileUploadAndDownloadService) DeleteFileChunk(fileMd5 string, filePath string) error { var chunks []example.ExaFileChunk var file example.ExaFile err := global.GVA_DB.Where("file_md5 = ? ", fileMd5).First(&file). Updates(map[string]interface{}{ "IsFinish": true, "file_path": filePath, }).Error if err != nil { return err } err = global.GVA_DB.Where("exa_file_id = ?", file.ID).Delete(&chunks).Unscoped().Error return err }