main.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package oss
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "strings"
  7. "time"
  8. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  9. )
  10. var bucket *oss.Bucket
  11. var ProjectRoot = "webserver"
  12. // InitOSSClient 初始化OSS鉴权客户端
  13. func Init() error {
  14. client, err := oss.New(os.Getenv("OSS_END_POINT"), os.Getenv("OSS_ACCESS_KEY_ID"), os.Getenv("OSS_ACCESS_KEY_SECRET"))
  15. if err != nil {
  16. panic("创建oss.Client失败")
  17. }
  18. // 获取存储空间。
  19. obucket, err := client.Bucket(os.Getenv("OSS_BUCKET"))
  20. if err != nil {
  21. panic("创建oss.Bucket失败")
  22. }
  23. bucket = obucket
  24. if os.Getenv("ENV_VALUE") == "test" {
  25. ProjectRoot = "testserver"
  26. }
  27. if os.Getenv("ENV_VALUE") == "dev" {
  28. ProjectRoot = "devserver"
  29. }
  30. return nil
  31. }
  32. func GetBucket() *oss.Bucket {
  33. return bucket
  34. }
  35. // Put 将文件流保存到指定目录
  36. func Put(file io.Reader, dst string) error {
  37. // 凭证有效期
  38. credentialTTL := 3600
  39. // 是否允许覆盖
  40. overwrite := true
  41. options := []oss.Option{
  42. oss.Expires(time.Now().Add(time.Duration(credentialTTL) * time.Second)),
  43. oss.ForbidOverWrite(!overwrite),
  44. }
  45. // 上传文件
  46. err := bucket.PutObject(dst, file, options...)
  47. if err != nil {
  48. return err
  49. }
  50. return nil
  51. }
  52. // Get 读取文件
  53. func Get(dst string) (*bytes.Buffer, error) {
  54. // 下载文件到缓存。
  55. body, err := bucket.GetObject(dst)
  56. if err != nil {
  57. return nil, err
  58. }
  59. defer body.Close()
  60. buf := new(bytes.Buffer)
  61. io.Copy(buf, body)
  62. return buf, nil
  63. }
  64. func Delete(dst []string, options ...oss.Option) (oss.DeleteObjectsResult, error) {
  65. // 将oss.DeleteObjectsQuiet设置为true,表示不返回删除结果。
  66. res, err := bucket.DeleteObjects(dst, options...)
  67. if err != nil {
  68. return res, err
  69. }
  70. return res, nil
  71. }
  72. func DeleteBatch(path string) error {
  73. marker := oss.Marker("")
  74. // 如果您需要删除所有前缀为src的文件,则prefix设置为src。设置为src后,所有前缀为src的非目录文件、src目录以及目录下的所有文件均会被删除。
  75. //prefix := oss.Prefix("src")
  76. // 如果您仅需要删除src目录及目录下的所有文件,则prefix设置为src/。
  77. dst := path
  78. if path[len(path)-1] != '/' {
  79. dst = dst + "/"
  80. }
  81. prefix := oss.Prefix(dst)
  82. lor, err := bucket.ListObjects(marker, prefix)
  83. if err != nil {
  84. return err
  85. }
  86. objects := []string{}
  87. for _, object := range lor.Objects {
  88. objects = append(objects, object.Key)
  89. }
  90. // 将oss.DeleteObjectsQuiet设置为true,表示不返回删除结果。
  91. _, err = Delete(objects, oss.DeleteObjectsQuiet(true))
  92. if err != nil {
  93. return err
  94. }
  95. return nil
  96. }
  97. func SignVideoImageURL(path string, style string) string {
  98. path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
  99. options := []oss.Option{}
  100. if style != "" {
  101. options = append(options, oss.Process(style))
  102. }
  103. signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, 600, options...)
  104. return signedGetURL
  105. }
  106. func SignVideoImageURLExpire(path string, style string, expire int64) string {
  107. path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
  108. options := []oss.Option{}
  109. if style != "" {
  110. options = append(options, oss.Process(style))
  111. }
  112. signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, expire, options...)
  113. return signedGetURL
  114. }
  115. // AssetsPreviewImageURL 资产缩略图地址
  116. func SignSourceUrl(path string) string {
  117. return path
  118. // 移除 http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/ 前缀
  119. path = strings.Replace(path, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
  120. signedGetURL, _ := bucket.SignURL(path, oss.HTTPGet, 600)
  121. return signedGetURL
  122. }
  123. // SignSourceUrlBatch 资产效果图地址
  124. func SignSourceUrlBatch(path string) []string {
  125. if path == "" {
  126. return []string{}
  127. }
  128. pathList := strings.Split(path, ",")
  129. return pathList
  130. signedGetURL := make([]string, 0, len(pathList))
  131. if !(len(pathList) == 0 || pathList[0] == "") {
  132. for _, v := range pathList {
  133. // 移除 http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/ 前缀
  134. v = strings.Replace(v, "http://idouwebmodels.oss-cn-hangzhou.aliyuncs.com/", "", 1)
  135. url, _ := bucket.SignURL(v, oss.HTTPGet, 600)
  136. signedGetURL = append(signedGetURL, url)
  137. }
  138. }
  139. return signedGetURL
  140. }
  141. func GetFolderSize(folderPath string) (int64, error) {
  142. dst := folderPath
  143. if folderPath[len(folderPath)-1] != '/' {
  144. dst = dst + "/"
  145. }
  146. var totalSize int64
  147. // 获取指定目录下的所有文件
  148. marker := oss.Marker("")
  149. for {
  150. listObjectsResult, err := bucket.ListObjects(marker, oss.Prefix(dst))
  151. if err != nil {
  152. return 0, err
  153. }
  154. // 累加文件大小
  155. for _, object := range listObjectsResult.Objects {
  156. totalSize += object.Size
  157. }
  158. // 遍历子目录
  159. for _, commonPrefix := range listObjectsResult.CommonPrefixes {
  160. subFolderName := commonPrefix[len(folderPath):]
  161. subFolderSize, err := GetFolderSize(subFolderName)
  162. if err != nil {
  163. return 0, err
  164. }
  165. totalSize += subFolderSize
  166. }
  167. // 判断是否还有更多文件需要获取
  168. if !listObjectsResult.IsTruncated {
  169. break
  170. }
  171. marker = oss.Marker(listObjectsResult.NextMarker)
  172. }
  173. return totalSize, nil
  174. }