s3_config.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package entity
  2. import (
  3. "backup-x/util"
  4. "errors"
  5. "log"
  6. "os"
  7. "strings"
  8. "github.com/aws/aws-sdk-go/aws"
  9. "github.com/aws/aws-sdk-go/aws/credentials"
  10. "github.com/aws/aws-sdk-go/aws/session"
  11. "github.com/aws/aws-sdk-go/service/s3"
  12. "github.com/aws/aws-sdk-go/service/s3/s3manager"
  13. )
  14. // S3Config S3Config
  15. type S3Config struct {
  16. Endpoint string
  17. AccessKey string
  18. SecretKey string
  19. BucketName string
  20. Region string
  21. }
  22. var ErrS3Empty = errors.New("s3 config is empty")
  23. func (s3Config S3Config) CheckNotEmpty() bool {
  24. return s3Config.Endpoint != "" && s3Config.AccessKey != "" &&
  25. s3Config.SecretKey != "" && s3Config.BucketName != ""
  26. }
  27. func (s3Config S3Config) getSession() (*session.Session, error) {
  28. if !s3Config.CheckNotEmpty() {
  29. return nil, ErrS3Empty
  30. }
  31. conf, err := GetConfigCache()
  32. if err != nil {
  33. return nil, err
  34. }
  35. secretKey, err := util.DecryptByEncryptKey(conf.EncryptKey, s3Config.SecretKey)
  36. if err != nil {
  37. return nil, err
  38. }
  39. creds := credentials.NewStaticCredentials(s3Config.AccessKey, secretKey, "")
  40. _, err = creds.Get()
  41. if err != nil {
  42. log.Println(err)
  43. }
  44. region := "cn-north-1"
  45. // 优先使用配置的Region
  46. if s3Config.Region != "" {
  47. region = s3Config.Region
  48. } else if strings.HasSuffix(s3Config.Endpoint, "amazonaws.com") {
  49. sp := strings.Split(s3Config.Endpoint, ".")
  50. if len(sp) > 1 {
  51. region = sp[1]
  52. }
  53. }
  54. config := &aws.Config{
  55. Region: aws.String(region),
  56. Endpoint: aws.String(s3Config.Endpoint),
  57. DisableSSL: aws.Bool(false),
  58. Credentials: creds,
  59. S3ForcePathStyle: aws.Bool(true),
  60. }
  61. mySession, err := session.NewSession(config)
  62. return mySession, err
  63. }
  64. func (s3Config S3Config) CreateBucketIfNotExist() {
  65. mySession, err := s3Config.getSession()
  66. if err != nil {
  67. if err != ErrS3Empty {
  68. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  69. }
  70. return
  71. }
  72. client := s3.New(mySession)
  73. head := &s3.HeadBucketInput{
  74. Bucket: aws.String(s3Config.BucketName),
  75. }
  76. _, err = client.HeadBucket(head)
  77. if err != nil {
  78. create := &s3.CreateBucketInput{
  79. Bucket: aws.String(s3Config.BucketName),
  80. }
  81. _, err = client.CreateBucket(create)
  82. if err != nil {
  83. log.Printf("创建bucket: %s 失败, ERR: %s\n", s3Config.BucketName, err)
  84. } else {
  85. log.Printf("创建bucket: %s 成功\n", s3Config.BucketName)
  86. }
  87. }
  88. }
  89. // UploadFile 上传
  90. func (s3Config S3Config) UploadFile(fileName string) {
  91. mySession, err := s3Config.getSession()
  92. if err != nil {
  93. if err != ErrS3Empty {
  94. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  95. }
  96. return
  97. }
  98. log.Printf("%s 正在上传至对象存储中...\n", fileName)
  99. file, err := os.Open(fileName)
  100. if err != nil {
  101. log.Println(err)
  102. return
  103. }
  104. defer file.Close()
  105. uploader := s3manager.NewUploader(mySession)
  106. _, err = uploader.Upload(&s3manager.UploadInput{
  107. Bucket: aws.String(s3Config.BucketName),
  108. Key: aws.String(fileName),
  109. Body: file,
  110. })
  111. if err != nil {
  112. log.Printf("%s 上传到对象存储失败. ERR: %s \n", fileName, err)
  113. } else {
  114. log.Printf("%s 上传到对象存储成功\n", fileName)
  115. }
  116. }
  117. // ListFiles 列出文件
  118. func (s3Config S3Config) ListFiles(projectPath string) (fileNames []string, err error) {
  119. mySession, err := s3Config.getSession()
  120. if err != nil {
  121. if err != ErrS3Empty {
  122. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  123. }
  124. return nil, err
  125. }
  126. svc := s3.New(mySession)
  127. params := &s3.ListObjectsInput{
  128. Bucket: aws.String(s3Config.BucketName),
  129. Prefix: aws.String(projectPath),
  130. }
  131. resp, err := svc.ListObjects(params)
  132. if err != nil {
  133. return nil, err
  134. }
  135. for _, item := range resp.Contents {
  136. fileNames = append(fileNames, *item.Key)
  137. }
  138. return fileNames, err
  139. }
  140. // DeleteFile 删除文件
  141. func (s3Config S3Config) DeleteFile(filePath string) error {
  142. mySession, err := s3Config.getSession()
  143. if err != nil {
  144. if err != ErrS3Empty {
  145. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  146. }
  147. return err
  148. }
  149. svc := s3.New(mySession)
  150. _, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: aws.String(s3Config.BucketName), Key: aws.String(filePath)})
  151. if err != nil {
  152. return err
  153. }
  154. return svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
  155. Bucket: aws.String(s3Config.BucketName),
  156. Key: aws.String(filePath),
  157. })
  158. }