s3_config.go 4.0 KB

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