aws_s3.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package services
  2. import (
  3. "bytes"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "github.com/aws/aws-sdk-go/aws"
  7. "github.com/aws/aws-sdk-go/aws/credentials"
  8. "github.com/aws/aws-sdk-go/aws/session"
  9. "github.com/aws/aws-sdk-go/service/s3"
  10. "io/ioutil"
  11. "time"
  12. )
  13. type OssClient interface {
  14. UploadFile(string, string, string) (string, error)
  15. GetUploadToken() (OssToken, error)
  16. }
  17. func NewOssClient() OssClient {
  18. switch utils.ObjectStorageClient {
  19. case utils.STORAGESOURCE_MINIO_NAME:
  20. return new(MinioOss)
  21. case utils.STORAGESOURCE_S3_NAME:
  22. return new(S3Oss)
  23. default:
  24. // 默认使用阿里云OSS
  25. return new(AliOss)
  26. }
  27. }
  28. // OssToken 此处为了兼容前端那边所以有重复的
  29. type OssToken struct {
  30. AccessKeyId string
  31. SecretKeyId string
  32. RegionId string
  33. Bucketname string
  34. Endpoint string
  35. ImgHost string
  36. UseSSL string
  37. Port string
  38. //AccessKeyId string
  39. AccessKeySecret string
  40. SecurityToken string
  41. ExpiredTime string
  42. //RegionId string
  43. //Bucketname string
  44. //Endpoint string
  45. Imghost string
  46. S3ForceStyle bool
  47. }
  48. type S3Oss struct{}
  49. func (m *S3Oss) UploadFile(fileName, localFile, savePath string) (resourceUrl string, err error) {
  50. defer func() {
  51. if err != nil {
  52. fmt.Println(err.Error())
  53. }
  54. }()
  55. endpoint := utils.S3Endpoint
  56. accessKey := utils.S3AccessKeyId
  57. secretKey := utils.S3AccessKeySecret
  58. region := utils.S3Region
  59. bucketName := utils.S3BucketName
  60. uploadDir := utils.S3UploadDir
  61. resourceHost := utils.S3Host
  62. forceStyle := utils.S3ForceStyle
  63. hostStyle := true // 默认true, 使用`endpoint/bucket_name`这种HOST格式
  64. if forceStyle == "false" {
  65. hostStyle = false
  66. }
  67. // 创建AWS会话
  68. sess, e := session.NewSession(&aws.Config{
  69. Region: aws.String(region),
  70. Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
  71. Endpoint: aws.String(endpoint),
  72. S3ForcePathStyle: aws.Bool(hostStyle),
  73. })
  74. if e != nil {
  75. err = fmt.Errorf("new session err: %s", e.Error())
  76. return
  77. }
  78. // 创建S3服务客户端
  79. client := s3.New(sess)
  80. // 读取文件内容
  81. fileContent, e := ioutil.ReadFile(localFile)
  82. if e != nil {
  83. err = fmt.Errorf("read file err: %s", e.Error())
  84. return
  85. }
  86. path := savePath
  87. if savePath == "" {
  88. path = uploadDir + time.Now().Format("200601/20060102/") + fileName
  89. }
  90. _, e = client.PutObject(&s3.PutObjectInput{
  91. Bucket: aws.String(bucketName),
  92. Key: aws.String(path),
  93. Body: bytes.NewReader(fileContent),
  94. })
  95. if e != nil {
  96. err = fmt.Errorf("put object err: %s", e.Error())
  97. return
  98. }
  99. resourceUrl = resourceHost + path
  100. return
  101. }
  102. func (m *S3Oss) GetUploadToken() (token OssToken, err error) {
  103. token.Endpoint = utils.S3Endpoint
  104. token.AccessKeyId = utils.S3AccessKeyId
  105. token.AccessKeySecret = utils.S3AccessKeySecret
  106. token.RegionId = utils.S3Region
  107. token.Bucketname = utils.S3BucketName
  108. token.ImgHost = utils.S3Host
  109. token.Port = utils.S3EndpointPort
  110. hostStyle := true // 默认true, 使用`endpoint/bucket_name`这种HOST格式
  111. if utils.S3ForceStyle == "false" {
  112. hostStyle = false
  113. }
  114. token.S3ForceStyle = hostStyle
  115. return
  116. }