s3_config.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. log.Printf("%s 正在上传至对象存储中...\n", fileName)
  95. file, err := os.Open(fileName)
  96. if err != nil {
  97. log.Println(err)
  98. return
  99. }
  100. defer file.Close()
  101. uploader := s3manager.NewUploader(mySession)
  102. _, err = uploader.Upload(&s3manager.UploadInput{
  103. Bucket: aws.String(s3Config.BucketName),
  104. Key: aws.String(fileName),
  105. Body: file,
  106. })
  107. if err != nil {
  108. log.Printf("%s 上传到对象存储失败. ERR: %s \n", fileName, err)
  109. } else {
  110. log.Printf("%s 上传到对象存储成功\n", fileName)
  111. }
  112. }
  113. // ListFiles 列出文件
  114. func (s3Config S3Config) ListFiles(projectPath string) (fileNames []string, err error) {
  115. mySession, err := s3Config.getSession()
  116. if err != nil {
  117. if err != ErrS3Empty {
  118. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  119. }
  120. return nil, err
  121. }
  122. svc := s3.New(mySession)
  123. params := &s3.ListObjectsInput{
  124. Bucket: aws.String(s3Config.BucketName),
  125. Prefix: aws.String(projectPath),
  126. }
  127. resp, err := svc.ListObjects(params)
  128. if err != nil {
  129. return nil, err
  130. }
  131. for _, item := range resp.Contents {
  132. fileNames = append(fileNames, *item.Key)
  133. }
  134. return fileNames, err
  135. }
  136. // DeleteFile 删除文件
  137. func (s3Config S3Config) DeleteFile(filePath string) error {
  138. mySession, err := s3Config.getSession()
  139. if err != nil {
  140. if err != ErrS3Empty {
  141. log.Printf("创建对象存储会话失败, ERR: %s\n", err)
  142. }
  143. return err
  144. }
  145. svc := s3.New(mySession)
  146. _, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: aws.String(s3Config.BucketName), Key: aws.String(filePath)})
  147. if err != nil {
  148. return err
  149. }
  150. return svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
  151. Bucket: aws.String(s3Config.BucketName),
  152. Key: aws.String(filePath),
  153. })
  154. }