cloudflare_r2.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package upload
  2. import (
  3. "errors"
  4. "fmt"
  5. "mime/multipart"
  6. "time"
  7. "github.com/aws/aws-sdk-go/aws"
  8. "github.com/aws/aws-sdk-go/aws/credentials"
  9. "github.com/aws/aws-sdk-go/aws/session"
  10. "github.com/aws/aws-sdk-go/service/s3"
  11. "github.com/aws/aws-sdk-go/service/s3/s3manager"
  12. "github.com/flipped-aurora/gin-vue-admin/server/global"
  13. "go.uber.org/zap"
  14. )
  15. type CloudflareR2 struct{}
  16. func (c *CloudflareR2) UploadFile(file *multipart.FileHeader) (fileUrl string, fileName string, err error) {
  17. session := c.newSession()
  18. client := s3manager.NewUploader(session)
  19. fileKey := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename)
  20. fileName = fmt.Sprintf("%s/%s", global.GVA_CONFIG.CloudflareR2.Path, fileKey)
  21. f, openError := file.Open()
  22. if openError != nil {
  23. global.GVA_LOG.Error("function file.Open() failed", zap.Any("err", openError.Error()))
  24. return "", "", errors.New("function file.Open() failed, err:" + openError.Error())
  25. }
  26. defer f.Close() // 创建文件 defer 关闭
  27. input := &s3manager.UploadInput{
  28. Bucket: aws.String(global.GVA_CONFIG.CloudflareR2.Bucket),
  29. Key: aws.String(fileName),
  30. Body: f,
  31. }
  32. _, err = client.Upload(input)
  33. if err != nil {
  34. global.GVA_LOG.Error("function uploader.Upload() failed", zap.Any("err", err.Error()))
  35. return "", "", err
  36. }
  37. return fmt.Sprintf("%s/%s", global.GVA_CONFIG.CloudflareR2.BaseURL,
  38. fileName),
  39. fileKey,
  40. nil
  41. }
  42. func (c *CloudflareR2) DeleteFile(key string) error {
  43. session := newSession()
  44. svc := s3.New(session)
  45. filename := global.GVA_CONFIG.CloudflareR2.Path + "/" + key
  46. bucket := global.GVA_CONFIG.CloudflareR2.Bucket
  47. _, err := svc.DeleteObject(&s3.DeleteObjectInput{
  48. Bucket: aws.String(bucket),
  49. Key: aws.String(filename),
  50. })
  51. if err != nil {
  52. global.GVA_LOG.Error("function svc.DeleteObject() failed", zap.Any("err", err.Error()))
  53. return errors.New("function svc.DeleteObject() failed, err:" + err.Error())
  54. }
  55. _ = svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
  56. Bucket: aws.String(bucket),
  57. Key: aws.String(filename),
  58. })
  59. return nil
  60. }
  61. func (*CloudflareR2) newSession() *session.Session {
  62. endpoint := fmt.Sprintf("%s.r2.cloudflarestorage.com", global.GVA_CONFIG.CloudflareR2.AccountID)
  63. return session.Must(session.NewSession(&aws.Config{
  64. Region: aws.String("auto"),
  65. Endpoint: aws.String(endpoint),
  66. Credentials: credentials.NewStaticCredentials(
  67. global.GVA_CONFIG.CloudflareR2.AccessKeyID,
  68. global.GVA_CONFIG.CloudflareR2.SecretAccessKey,
  69. "",
  70. ),
  71. }))
  72. }