fusenapi/utils/file/upload.go

238 lines
5.7 KiB
Go
Raw Normal View History

package file
import (
"context"
"fusenapi/model/gmodel"
"fusenapi/utils/basic"
2023-08-09 07:15:12 +00:00
"net/http"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type Upload struct {
Ctx context.Context
MysqlConn *gorm.DB
AwsSession *session.Session
}
type UploadBaseReq struct {
2023-08-22 02:48:10 +00:00
Refresh bool
2023-08-16 09:33:34 +00:00
Source string
FileHash string
FileData string
Metadata string
UploadBucket int64
ApiType int64
UserId int64
GuestId int64
2023-08-09 07:15:12 +00:00
FileByte []byte
}
type UploadBaseRes struct {
Key string `json:"key"`
Status int64 `json:"status"`
ApiType int64 `json:"api_type"`
ResourceId string `json:"resource_id"`
ResourceType string `json:"resource_type"`
ResourceUrl string `json:"resource_url"`
}
func (upload *Upload) UploadFileByBase64(req *UploadBaseReq) (*UploadBaseRes, error) {
// 定义存储桶名称
var bucketName *string
var apiType int64 = req.ApiType
// 根据类别选择存储桶
switch req.UploadBucket {
case 2:
bucketName = basic.TempfileBucketName
default:
bucketName = basic.StorageBucketName
}
// 设置AWS会话的区域
upload.AwsSession.Config.Region = aws.String("us-west-1")
// 创建新的S3服务实例
svc := s3.New(upload.AwsSession)
// 定义S3请求和当前时间
var s3req *request.Request
var resourceId string = req.FileHash
var uploadBaseRes = UploadBaseRes{}
2023-08-22 02:48:10 +00:00
err := upload.MysqlConn.Transaction(func(tx *gorm.DB) (err error) {
2023-08-10 08:13:06 +00:00
var resourceInfo *gmodel.FsResource
2023-08-22 02:48:10 +00:00
if !req.Refresh {
err = tx.Where("resource_id =?", resourceId).Take(&resourceInfo).Error
}
if !req.Refresh && err == nil && resourceInfo.ResourceId != "" {
2023-08-09 06:58:20 +00:00
uploadBaseRes.Status = 1
uploadBaseRes.ResourceId = resourceId
uploadBaseRes.ResourceUrl = *resourceInfo.ResourceUrl
} else {
dist, contentType, err := FileBase64ToByte(req.FileData)
2023-08-09 06:58:20 +00:00
if err != nil {
logx.Errorf("err:%+vdesc:%+v", err, "fail.upload.resourceInfoGet.mysql")
return err
}
2023-08-09 06:58:20 +00:00
// 创建S3对象存储请求
s3req, _ = svc.PutObjectRequest(
&s3.PutObjectInput{
Bucket: bucketName,
Key: &resourceId,
},
)
2023-08-09 06:58:20 +00:00
// 设置请求体为文件数据
s3req.SetBufferBody(dist)
2023-08-09 06:58:20 +00:00
// 发送请求
2023-08-09 07:15:12 +00:00
err = s3req.Send()
// 检查是否有错误
if err != nil {
logx.Errorf("err:%+vdesc:%+v", err, "fail.upload.s3req")
return err
} else {
var url = s3req.HTTPRequest.URL.String()
// 打印请求URL
logx.Info(url)
uploadBaseRes.Status = 1
uploadBaseRes.ResourceId = resourceId
uploadBaseRes.ResourceUrl = url
var version string = "0.0.1"
var nowTime = time.Now()
2023-08-10 08:13:06 +00:00
err = tx.Create(&gmodel.FsResource{
2023-08-09 07:15:12 +00:00
ResourceId: resourceId,
UserId: &req.UserId,
GuestId: &req.GuestId,
ResourceType: &contentType,
ResourceUrl: &url,
Version: &version,
UploadedAt: &nowTime,
Metadata: &req.Metadata,
ApiType: &apiType,
BucketName: bucketName,
2023-08-16 09:33:34 +00:00
Source: &req.Source,
2023-08-10 08:13:06 +00:00
}).Error
2023-08-09 07:15:12 +00:00
if err != nil {
logx.Errorf("err:%+vdesc:%+v", err, "fail.upload.resourceInfoAdd.mysql")
return err
}
}
}
2023-08-10 06:49:46 +00:00
// 返回 nil 提交事务
2023-08-09 07:15:12 +00:00
return nil
})
2023-08-10 06:49:46 +00:00
2023-08-09 07:15:12 +00:00
if err != nil {
return nil, err
}
return &uploadBaseRes, err
}
func (upload *Upload) UploadFileByByte(req *UploadBaseReq) (*UploadBaseRes, error) {
// 定义存储桶名称
var bucketName *string
var apiType int64 = req.ApiType
// 根据类别选择存储桶
switch req.UploadBucket {
case 2:
bucketName = basic.TempfileBucketName
default:
bucketName = basic.StorageBucketName
}
// 设置AWS会话的区域
upload.AwsSession.Config.Region = aws.String("us-west-1")
// 创建新的S3服务实例
svc := s3.New(upload.AwsSession)
// 定义S3请求和当前时间
var s3req *request.Request
var resourceId string = req.FileHash
var uploadBaseRes = UploadBaseRes{}
2023-08-10 08:13:06 +00:00
err := upload.MysqlConn.Transaction(func(tx *gorm.DB) error {
var resourceInfo *gmodel.FsResource
err := tx.Where("resource_id =?", resourceId).Take(&resourceInfo).Error
// resourceInfo, err := resourceModelTS.FindOneById(ctx, resourceId)
2023-08-09 07:15:12 +00:00
if err == nil && resourceInfo.ResourceId != "" {
uploadBaseRes.Status = 1
uploadBaseRes.ResourceId = resourceId
uploadBaseRes.ResourceUrl = *resourceInfo.ResourceUrl
} else {
contentType := http.DetectContentType(req.FileByte)
// 创建S3对象存储请求
s3req, _ = svc.PutObjectRequest(
&s3.PutObjectInput{
Bucket: bucketName,
Key: &resourceId,
},
)
// 设置请求体为文件数据
s3req.SetBufferBody(req.FileByte)
// 发送请求
2023-08-09 06:58:20 +00:00
err = s3req.Send()
// 检查是否有错误
if err != nil {
2023-08-09 06:58:20 +00:00
logx.Errorf("err:%+vdesc:%+v", err, "fail.upload.s3req")
return err
} else {
var url = s3req.HTTPRequest.URL.String()
// 打印请求URL
logx.Info(url)
uploadBaseRes.Status = 1
uploadBaseRes.ResourceId = resourceId
uploadBaseRes.ResourceUrl = url
var version string = "0.0.1"
var nowTime = time.Now()
2023-08-10 08:13:06 +00:00
err = tx.Create(&gmodel.FsResource{
2023-08-09 06:58:20 +00:00
ResourceId: resourceId,
UserId: &req.UserId,
GuestId: &req.GuestId,
ResourceType: &contentType,
ResourceUrl: &url,
Version: &version,
UploadedAt: &nowTime,
Metadata: &req.Metadata,
ApiType: &apiType,
BucketName: bucketName,
2023-08-16 09:33:34 +00:00
Source: &req.Source,
2023-08-10 08:13:06 +00:00
}).Error
2023-08-09 06:58:20 +00:00
if err != nil {
logx.Errorf("err:%+vdesc:%+v", err, "fail.upload.resourceInfoAdd.mysql")
return err
}
}
}
2023-08-09 06:58:20 +00:00
return nil
})
if err != nil {
return nil, err
}
2023-08-09 06:58:20 +00:00
return &uploadBaseRes, err
}