aws_s3.go 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package upload
  2. import (
  3. "errors"
  4. "fmt"
  5. "mime/multipart"
  6. "time"
  7. "server/global"
  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. "go.uber.org/zap"
  14. )
  15. type AwsS3 struct{}
  16. //@author: [WqyJh](https://github.com/WqyJh)
  17. //@object: *AwsS3
  18. //@function: UploadFile
  19. //@description: Upload dept to Aws S3 using aws-sdk-go. See https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-basic-bucket-operations.html#s3-examples-bucket-ops-upload-dept-to-bucket
  20. //@param: dept *multipart.FileHeader
  21. //@return: string, string, error
  22. func (*AwsS3) UploadFile(dept *multipart.FileHeader) (string, string, error) {
  23. session := newSession()
  24. uploader := s3manager.NewUploader(session)
  25. deptKey := fmt.Sprintf("%d%s", time.Now().Unix(), dept.Filename)
  26. deptname := global.GVA_CONFIG.AwsS3.PathPrefix + "/" + deptKey
  27. f, openError := dept.Open()
  28. if openError != nil {
  29. global.GVA_LOG.Error("function dept.Open() failed", zap.Any("err", openError.Error()))
  30. return "", "", errors.New("function dept.Open() failed, err:" + openError.Error())
  31. }
  32. defer f.Close() // 创建文件 defer 关闭
  33. _, err := uploader.Upload(&s3manager.UploadInput{
  34. Bucket: aws.String(global.GVA_CONFIG.AwsS3.Bucket),
  35. Key: aws.String(deptname),
  36. Body: f,
  37. })
  38. if err != nil {
  39. global.GVA_LOG.Error("function uploader.Upload() failed", zap.Any("err", err.Error()))
  40. return "", "", err
  41. }
  42. return global.GVA_CONFIG.AwsS3.BaseURL + "/" + deptname, deptKey, nil
  43. }
  44. //@author: [WqyJh](https://github.com/WqyJh)
  45. //@object: *AwsS3
  46. //@function: DeleteFile
  47. //@description: Delete dept from Aws S3 using aws-sdk-go. See https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-basic-bucket-operations.html#s3-examples-bucket-ops-delete-bucket-item
  48. //@param: dept *multipart.FileHeader
  49. //@return: string, string, error
  50. func (*AwsS3) DeleteFile(key string) error {
  51. session := newSession()
  52. svc := s3.New(session)
  53. deptname := global.GVA_CONFIG.AwsS3.PathPrefix + "/" + key
  54. bucket := global.GVA_CONFIG.AwsS3.Bucket
  55. _, err := svc.DeleteObject(&s3.DeleteObjectInput{
  56. Bucket: aws.String(bucket),
  57. Key: aws.String(deptname),
  58. })
  59. if err != nil {
  60. global.GVA_LOG.Error("function svc.DeleteObject() failed", zap.Any("err", err.Error()))
  61. return errors.New("function svc.DeleteObject() failed, err:" + err.Error())
  62. }
  63. _ = svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
  64. Bucket: aws.String(bucket),
  65. Key: aws.String(deptname),
  66. })
  67. return nil
  68. }
  69. // newSession Create S3 session
  70. func newSession() *session.Session {
  71. sess, _ := session.NewSession(&aws.Config{
  72. Region: aws.String(global.GVA_CONFIG.AwsS3.Region),
  73. Endpoint: aws.String(global.GVA_CONFIG.AwsS3.Endpoint), //minio在这里设置地址,可以兼容
  74. S3ForcePathStyle: aws.Bool(global.GVA_CONFIG.AwsS3.S3ForcePathStyle),
  75. DisableSSL: aws.Bool(global.GVA_CONFIG.AwsS3.DisableSSL),
  76. Credentials: credentials.NewStaticCredentials(
  77. global.GVA_CONFIG.AwsS3.SecretID,
  78. global.GVA_CONFIG.AwsS3.SecretKey,
  79. "",
  80. ),
  81. })
  82. return sess
  83. }