Files
xuanzhi-service/server/utils/upload/cloudflare_r2.go
wdh-home 05ee541420
Some checks failed
CI / init (push) Has been cancelled
CI / Frontend node 18.16.0 (push) Has been cancelled
CI / Backend go (1.22) (push) Has been cancelled
CI / devops-test (1.22, 18.16.0) (push) Has been cancelled
CI / release-pr (push) Has been cancelled
CI / release-please (push) Has been cancelled
CI / devops-prod (1.22, 18.x) (push) Has been cancelled
CI / docker (push) Has been cancelled
init
2026-04-21 16:50:31 +08:00

86 lines
2.6 KiB
Go

package upload
import (
"context"
"errors"
"fmt"
"mime/multipart"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"go.uber.org/zap"
)
type CloudflareR2 struct{}
func (c *CloudflareR2) UploadFile(file *multipart.FileHeader) (fileUrl string, fileName string, err error) {
client := c.newR2Client()
uploader := manager.NewUploader(client)
fileKey := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename)
fileName = fmt.Sprintf("%s/%s", global.GVA_CONFIG.CloudflareR2.Path, fileKey)
f, openError := file.Open()
if openError != nil {
global.GVA_LOG.Error("function file.Open() failed", zap.Any("err", openError.Error()))
return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
}
defer f.Close() // 创建文件 defer 关闭
_, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{
Bucket: aws.String(global.GVA_CONFIG.CloudflareR2.Bucket),
Key: aws.String(fileName),
Body: f,
})
if err != nil {
global.GVA_LOG.Error("function uploader.Upload() failed", zap.Any("err", err.Error()))
return "", "", err
}
return fmt.Sprintf("%s/%s", global.GVA_CONFIG.CloudflareR2.BaseURL, fileName), fileKey, nil
}
func (c *CloudflareR2) DeleteFile(key string) error {
client := c.newR2Client()
filename := global.GVA_CONFIG.CloudflareR2.Path + "/" + key
bucket := global.GVA_CONFIG.CloudflareR2.Bucket
_, err := client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
})
if err != nil {
global.GVA_LOG.Error("function client.DeleteObject() failed", zap.Any("err", err.Error()))
return errors.New("function client.DeleteObject() failed, err:" + err.Error())
}
waiter := s3.NewObjectNotExistsWaiter(client)
_ = waiter.Wait(context.TODO(), &s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(filename),
}, 30*time.Second)
return nil
}
func (*CloudflareR2) newR2Client() *s3.Client {
endpoint := fmt.Sprintf("https://%s.r2.cloudflarestorage.com", global.GVA_CONFIG.CloudflareR2.AccountID)
cfg, _ := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("auto"),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
global.GVA_CONFIG.CloudflareR2.AccessKeyID,
global.GVA_CONFIG.CloudflareR2.SecretAccessKey,
"",
)),
)
return s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String(endpoint)
})
}