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) }) }