oss.go 6.4 KB

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