s3_config.go 3.8 KB

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