Pārlūkot izejas kodu

脚本热更新对接七牛云

maker 3 gadi atpakaļ
vecāks
revīzija
d13e4d57eb

+ 100 - 35
service/task/upload_file.go

@@ -1,10 +1,15 @@
 package task
 
 import (
+	"bufio"
+	"bytes"
+	"context"
 	"crypto/md5"
 	"encoding/hex"
 	"errors"
 	"fmt"
+	"github.com/qiniu/api.v7/v7/auth/qbox"
+	"github.com/qiniu/api.v7/v7/storage"
 	"go.uber.org/zap"
 	"gorm.io/gorm"
 	"io"
@@ -15,8 +20,8 @@ import (
 	"log-server/model/task/response"
 	"log-server/utils"
 	"mime/multipart"
-	"os"
 	"path"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -30,7 +35,7 @@ func (e *UploadFileService) Upload(file response.UploadFileResponse) error {
 }
 
 //更改的上传文件函数
-func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string, string, string, error) {
+func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader, taskId string) (string, string, string, error) {
 	// 读取文件后缀
 	ext := path.Ext(file.Filename)
 	// 读取文件名并加密
@@ -38,24 +43,29 @@ func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string,
 	name = utils.MD5V([]byte(name))
 	// 拼接新文件名
 	filename := name + "_" + time.Now().Format("20060102150405") + ext
+	key := "shuyou/script/" + taskId + "/" + filename
 	// 尝试创建此路径
-	mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.ScriptPath, os.ModePerm)
-	if mkdirErr != nil {
-		global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
-		return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
-	}
+	//mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.ScriptPath, os.ModePerm)
+	//if mkdirErr != nil {
+	//	global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
+	//	return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
+	//}
 	// 拼接路径和文件名
-	p := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
-	filepath := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
-
+	//p := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
+	//filepath := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
 
-	f, openError := file.Open() // 读取文件
+	uploadErr := e.UploadFileToQiNiu(filename, taskId, file)
+	if uploadErr != nil {
+		global.GVA_LOG.Error("function UploadFileToQiNiu Filed", zap.Any("err", uploadErr.Error()))
+		return "", "", "", errors.New("function UploadFileToQiNiu Filed, err:" + uploadErr.Error())
+	}
+	//f, openError := file.Open() // 读取文件
 	f1, openErr := file.Open()	//	读取文件生成MD5值
-	if openError != nil || openErr != nil {
-		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
-		return "", "", "", errors.New("function file.Open() Filed, err:" + openError.Error())
+	if  openErr != nil {
+		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openErr.Error()))
+		return "", "", "", errors.New("function file.Open() Filed, err:" + openErr.Error())
 	}
-	defer f.Close() // 创建文件 defer 关闭
+	//defer f.Close() // 创建文件 defer 关闭
 	defer f1.Close()
 	//生成md5值
 	md5h := md5.New()
@@ -63,24 +73,72 @@ func (e *UploadFileService) UploadFileFunc(file *multipart.FileHeader) (string,
 	md5String := hex.EncodeToString(md5h.Sum(nil))
 
 	//
-	out, createErr := os.Create(p)
-	if createErr != nil {
-		global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
+	//out, createErr := os.Create(p)
+	//if createErr != nil {
+	//	global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
+	//
+	//	return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
+	//}
+	//defer out.Close() // 创建文件 defer 关闭
 
-		return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
-	}
-	defer out.Close() // 创建文件 defer 关闭
+	//_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
+	//fmt.Println("拷贝文件")
+	//if copyErr != nil {
+	//	global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
+	//	return "", "", "",  errors.New("function io.Copy() Filed, err:" + copyErr.Error())
+	//}
+	return key, filename, md5String, nil
+}
 
-	_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
-	fmt.Println("拷贝文件")
-	if copyErr != nil {
-		global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
-		return "", "", "",  errors.New("function io.Copy() Filed, err:" + copyErr.Error())
+func (e *UploadFileService) UploadFileToQiNiu(fileName string, taskId string, file *multipart.FileHeader) ( error) {
+	accessKey := "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW"
+	secretKey := "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
+	mac := qbox.NewMac(accessKey, secretKey)
+	bucket := "pinaishop"
+	putPolicy := storage.PutPolicy{
+		Scope: bucket,
 	}
-	return filepath, filename, md5String, nil
-}
+	key :="shuyou/script/" +  taskId + "/" + fileName
 
 
+	upToken := putPolicy.UploadToken(mac)
+	cfg := storage.Config{}
+	// 空间对应的机房
+	cfg.Region = &storage.ZoneHuanan
+	// 是否使用https域名
+	cfg.UseHTTPS = true
+	// 上传是否使用CDN上传加速
+	cfg.UseCdnDomains = false
+	formUploader := storage.NewFormUploader(&cfg)
+	ret := storage.PutRet{}
+	putExtra := storage.PutExtra{
+		//Params: map[string]string{
+		//	"x:name": "github logo",
+		//},
+	}
+	// Get the file size
+	fileSize := file.Size
+	f, openError := file.Open() // 读取文件
+	if openError != nil  {
+		global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
+		return errors.New("function file.Open() Filed, err:" + openError.Error())
+	}
+	defer f.Close()
+	// Read the file into a byte slice
+	bs := make([]byte, fileSize)
+	_, err := bufio.NewReader(f).Read(bs)
+	if err != nil && err != io.EOF {
+		fmt.Println(err)
+		return errors.New("文件转化成字节数组错误, err:" + err.Error())
+	}
+	err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(bs), fileSize, &putExtra)
+	if err != nil {
+		fmt.Println(err)
+		return errors.New("上传七牛云错误, err:" + err.Error())
+	}
+	fmt.Println(ret.Key, ret.Hash)
+	return nil
+}
 
 //上传文件
 func (e *UploadFileService) UploadFile(taskId int, user string, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
@@ -90,20 +148,26 @@ func (e *UploadFileService) UploadFile(taskId int, user string, header *multipar
 	var lastRecord response.UploadFileResponse
 	var version int
 	//定义下载前缀
-	var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
-	filePath, key, md5String, uploadErr := e.UploadFileFunc(header)
-	if uploadErr != nil {
-		panic(err)
-	}
+	var prefix string = "http://cdn.pinaishop.kfzs.com/"
 
 	global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Count(&count)
 	if count == 0 {
 		version = 1
 	} else {
-		global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Last(&lastRecord)
+		fmt.Println(count)
+		global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Order("id desc").Limit(1).Find(&lastRecord)
+		fmt.Println(lastRecord)
 		version = lastRecord.Version + 1
+
+		recordArr := []response.UploadFileResponse{}
+		global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Find(&recordArr)
+		fmt.Println(recordArr)
 	}
 
+	filePath, key, md5String, uploadErr := e.UploadFileFunc(header,strconv.Itoa(taskId) )
+	if uploadErr != nil {
+		panic(err)
+	}
 	s := strings.Split(header.Filename, ".")
 	f := response.UploadFileResponse{
 		TaskID: taskId,
@@ -125,7 +189,7 @@ func (e *UploadFileService) DownloadFile(taskId int, md5String string) (info res
 	//改由存储至数据库的时候拼接前缀
 	//var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
 	//数据库中无记录,即不需要更新
-	err = global.GVA_DB.Table("upload_file").Where("task_id = ? and state = 1", taskId).Last(&file).Error
+	err = global.GVA_DB.Table("upload_file").Where("task_id = ? and state = 1", taskId).Order("id desc").Limit(1).Find(&file).Error
 	if errors.Is(err, gorm.ErrRecordNotFound) {
 		info = response.DownloadFile{
 			Url: "",
@@ -184,6 +248,7 @@ func (e *UploadFileService) GetScriptList(script task.GameScriptResponse, info r
 			orderMap["task_id"] = true
 			orderMap["name"] = true
 			orderMap["responsible_person"] = true
+			orderMap["version"] = true
 			if orderMap[order] {
 				//合法排序字符
 				if desc {

BIN
uploads/file/scriptFile/10d3279ef8b9a19d712844c66812a079_20230308150102.dll