oss.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/services/alarm_msg"
  6. "fmt"
  7. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  8. "os"
  9. "time"
  10. "eta/eta_api/utils"
  11. "github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
  12. )
  13. // UploadAliyunV2 图片上传到阿里云
  14. //func UploadAliyunV2(filename, filepath string) (string, error) {
  15. // if utils.AccessKeyId == `` {
  16. // return "0", errors.New("阿里云信息未配置")
  17. // }
  18. // client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  19. // if err != nil {
  20. // return "1", err
  21. // }
  22. // bucket, err := client.Bucket(utils.Bucketname)
  23. // if err != nil {
  24. // return "2", err
  25. // }
  26. // path := utils.UploadDir + time.Now().Format("200601/20060102/")
  27. // path += filename
  28. // err = bucket.PutObjectFromFile(path, filepath)
  29. // if err != nil {
  30. // return "3", err
  31. // }
  32. // path = utils.Imghost + path
  33. // return path, err
  34. //}
  35. // UploadAudioAliyun 音频上传到阿里云
  36. //func UploadAudioAliyun(filename, filepath string) (string, error) {
  37. // if utils.AccessKeyId == `` {
  38. // return "0", errors.New("阿里云信息未配置")
  39. // }
  40. // client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  41. // if err != nil {
  42. // return "1", err
  43. // }
  44. // bucket, err := client.Bucket(utils.Bucketname)
  45. // if err != nil {
  46. // return "2", err
  47. // }
  48. // path := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
  49. // path += filename
  50. // err = bucket.PutObjectFromFile(path, filepath)
  51. // if err != nil {
  52. // return "3", err
  53. // }
  54. // path = utils.Imghost + path
  55. // return path, err
  56. //}
  57. // UploadVideoAliyun 视频上传到阿里云
  58. //func UploadVideoAliyun(filename, filepath, savePath string) error {
  59. // if utils.AccessKeyId == `` {
  60. // return errors.New("阿里云信息未配置")
  61. // }
  62. // defer func() {
  63. // os.Remove(filepath)
  64. // }()
  65. // client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  66. // if err != nil {
  67. // return err
  68. // }
  69. // bucket, err := client.Bucket(utils.Bucketname)
  70. // if err != nil {
  71. // return err
  72. // }
  73. // //path := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
  74. // //path += filename
  75. // err = bucket.PutObjectFromFile(savePath, filepath)
  76. // if err != nil {
  77. // return err
  78. // }
  79. // //path = utils.Imghost + path
  80. // //return path,err
  81. // return err
  82. //}
  83. // UploadFileToAliyun 上传文件到阿里云
  84. //func UploadFileToAliyun(filename, filepath, savePath string) error {
  85. // if utils.AccessKeyId == `` {
  86. // return errors.New("阿里云信息未配置")
  87. // }
  88. // defer func() {
  89. // os.Remove(filepath)
  90. // }()
  91. // client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  92. // if err != nil {
  93. // return err
  94. // }
  95. // bucket, err := client.Bucket(utils.Bucketname)
  96. // if err != nil {
  97. // return err
  98. // }
  99. // //path := utils.Upload_Audio_Dir + time.Now().Format("200601/20060102/")
  100. // //path += filename
  101. // err = bucket.PutObjectFromFile(savePath, filepath)
  102. // if err != nil {
  103. // return err
  104. // }
  105. // //path = utils.Imghost + path
  106. // //return path,err
  107. // return err
  108. //}
  109. type STSToken struct {
  110. AccessKeyId string
  111. AccessKeySecret string
  112. SecurityToken string
  113. ExpiredTime string
  114. RegionId string
  115. Bucketname string
  116. Endpoint string
  117. Imghost string
  118. }
  119. // GetOssSTSToken 获取STSToken
  120. func GetOssSTSToken() (item *STSToken, err error) {
  121. defer func() {
  122. if err != nil {
  123. utils.FileLog.Info(err.Error())
  124. go alarm_msg.SendAlarmMsg("获取STSToken失败, ErrMsg: "+err.Error(), 3)
  125. }
  126. }()
  127. item = new(STSToken)
  128. // 获取缓存中的Token
  129. recent, _ := utils.Rc.RedisString(utils.STSTokenCacheKey)
  130. if recent != "" {
  131. lastToken := new(STSToken)
  132. if e := json.Unmarshal([]byte(recent), &lastToken); e != nil {
  133. err = errors.New("GetOssSTSToken lastToken Unmarshal Err: " + e.Error())
  134. return
  135. }
  136. // 未防止正在上传大文件时Token过期, 将判定的过期时间提前10分钟
  137. afterTime := time.Now().Local().Add(10 * time.Minute)
  138. expired, e := time.ParseInLocation(utils.FormatDateTime, lastToken.ExpiredTime, time.Local)
  139. if e != nil {
  140. err = errors.New("GetOssSTSToken expiredTime Parse Err: " + e.Error())
  141. return
  142. }
  143. if expired.After(afterTime) {
  144. item.AccessKeyId = lastToken.AccessKeyId
  145. item.AccessKeySecret = lastToken.AccessKeySecret
  146. item.SecurityToken = lastToken.SecurityToken
  147. item.ExpiredTime = lastToken.ExpiredTime
  148. item.RegionId = utils.RegionId
  149. item.Bucketname = utils.Bucketname
  150. item.Endpoint = utils.Imghost
  151. item.Imghost = utils.Imghost
  152. return
  153. }
  154. }
  155. // 已过期则获取新的token
  156. newToken, e := NewSTSToken()
  157. if e != nil {
  158. err = errors.New("GetOssSTSToken NewSTSToken Err: " + e.Error())
  159. return
  160. }
  161. newTokenJson, e := json.Marshal(newToken)
  162. if e != nil {
  163. err = errors.New("GetOssSTSToken NewToken JSON Err: " + e.Error())
  164. return
  165. }
  166. // 覆盖缓存
  167. if e := utils.Rc.Put(utils.STSTokenCacheKey, newTokenJson, time.Hour); e != nil {
  168. err = errors.New("GetOssSTSToken SetRedis Err: " + e.Error())
  169. return
  170. }
  171. item = newToken
  172. return
  173. }
  174. // NewSTSToken 获取一个新的STSToken
  175. func NewSTSToken() (item *STSToken, err error) {
  176. defer func() {
  177. if err != nil {
  178. utils.FileLog.Info(err.Error())
  179. }
  180. }()
  181. item = new(STSToken)
  182. client, e := sts.NewClientWithAccessKey("cn-shanghai", utils.RAMAccessKeyId, utils.RAMAccessKeySecret)
  183. if e != nil {
  184. err = errors.New("NewSTSToken NewClient Err: " + e.Error())
  185. return
  186. }
  187. request := sts.CreateAssumeRoleRequest()
  188. request.Scheme = utils.AliStsScheme
  189. request.RegionId = utils.RegionId
  190. request.RoleArn = utils.RoleArn
  191. now := time.Now().Format(utils.FormatDateTimeUnSpace)
  192. request.RoleSessionName = utils.RoleSessionName + now
  193. request.DurationSeconds = "3600"
  194. request.ConnectTimeout = 300 * time.Second
  195. request.ReadTimeout = 300 * time.Second
  196. response, e := client.AssumeRole(request)
  197. if e != nil {
  198. err = errors.New("NewSTSToken AssumeRole Err: " + e.Error())
  199. return
  200. }
  201. if response != nil {
  202. item.AccessKeyId = response.Credentials.AccessKeyId
  203. item.AccessKeySecret = response.Credentials.AccessKeySecret
  204. item.SecurityToken = response.Credentials.SecurityToken
  205. t, _ := time.Parse(time.RFC3339, response.Credentials.Expiration)
  206. expiration := t.In(time.Local)
  207. item.ExpiredTime = expiration.Format(utils.FormatDateTime)
  208. item.RegionId = utils.RegionId
  209. item.Bucketname = utils.Bucketname
  210. item.Endpoint = utils.Imghost
  211. item.Imghost = utils.Imghost
  212. }
  213. return
  214. }
  215. // UploadAliyunToDir 上传至hzchart
  216. //func UploadAliyunToDir(filename, filepath, uploadDir, fileDir string) (string, error) {
  217. // if utils.AccessKeyId == `` {
  218. // return "0", errors.New("阿里云信息未配置")
  219. // }
  220. // client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  221. // if err != nil {
  222. // return "1", err
  223. // }
  224. // bucket, err := client.Bucket(utils.Bucketname)
  225. // if err != nil {
  226. // return "2", err
  227. // }
  228. // if uploadDir == "" {
  229. // uploadDir = utils.UploadDir
  230. // }
  231. // if fileDir == "" {
  232. // fileDir = time.Now().Format("200601/20060102/")
  233. // }
  234. // path := uploadDir + fileDir
  235. // path += filename
  236. // err = bucket.PutObjectFromFile(path, filepath)
  237. // if err != nil {
  238. // return "3", err
  239. // }
  240. // path = utils.Imghost + path
  241. // return path, err
  242. //}
  243. type AliOss struct{}
  244. // UploadFile 上传文件
  245. func (m *AliOss) UploadFile(fileName, filePath, savePath string) (string, error) {
  246. defer func() {
  247. _ = os.Remove(filePath)
  248. }()
  249. if utils.AccessKeyId == `` {
  250. return "0", errors.New("阿里云信息未配置")
  251. }
  252. client, err := oss.New(utils.Endpoint, utils.AccessKeyId, utils.AccessKeySecret)
  253. if err != nil {
  254. return "1", err
  255. }
  256. bucket, err := client.Bucket(utils.Bucketname)
  257. if err != nil {
  258. return "2", err
  259. }
  260. path := savePath
  261. if savePath == "" {
  262. path = utils.UploadDir + time.Now().Format("200601/20060102/") + fileName
  263. }
  264. err = bucket.PutObjectFromFile(path, filePath)
  265. if err != nil {
  266. return "3", err
  267. }
  268. resourceUrl := utils.Imghost + path
  269. return resourceUrl, err
  270. }
  271. func (m *AliOss) GetUploadToken() (token OssToken, err error) {
  272. stsToken, e := GetOssSTSToken()
  273. if e != nil {
  274. err = fmt.Errorf("GetOssSTSToken err: %s", e.Error())
  275. return
  276. }
  277. token.AccessKeyId = stsToken.AccessKeyId
  278. token.AccessKeySecret = stsToken.AccessKeySecret
  279. token.SecurityToken = stsToken.SecurityToken
  280. token.ExpiredTime = stsToken.ExpiredTime
  281. token.RegionId = stsToken.RegionId
  282. token.Bucketname = stsToken.Bucketname
  283. token.Endpoint = stsToken.Endpoint
  284. token.Imghost = stsToken.Imghost
  285. return
  286. }