oss.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package oss
  2. import (
  3. "bytes"
  4. "io"
  5. "log"
  6. "git.sxidc.com/go-tools/utils/strutils"
  7. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  8. "github.com/pkg/errors"
  9. )
  10. var bucketName = "fs-yf"
  11. func BucketName(name string) {
  12. bucketName = name
  13. }
  14. var Bkt *oss.Bucket
  15. var pfx string
  16. func Init(endpoint, keyID, keySecret, prefix string) error {
  17. pfx = prefix
  18. client, err := oss.New(endpoint, keyID, keySecret)
  19. if err != nil {
  20. return err
  21. }
  22. Bkt, err = client.Bucket(bucketName)
  23. if err != nil {
  24. return err
  25. }
  26. return nil
  27. }
  28. func Touch(reader io.Reader, to string) error {
  29. return TouchPrefix(reader, to, true)
  30. }
  31. func TouchPrefix(reader io.Reader, to string, addPfx bool) error {
  32. if addPfx {
  33. return Bkt.PutObject(pfx+to, reader)
  34. }
  35. return Bkt.PutObject(to, reader)
  36. }
  37. func Url(obj string) (string, error) {
  38. return UrlPfx(obj, true)
  39. }
  40. func UrlPfx(obj string, addPfx bool) (string, error) {
  41. if strutils.HasBlank(obj) {
  42. log.Println("oss获取Url发现违规参数")
  43. return "", nil
  44. }
  45. if addPfx {
  46. return Bkt.SignURL(pfx+obj, oss.HTTPGet, 60*60*60*365)
  47. }
  48. return Bkt.SignURL(obj, oss.HTTPGet, 60*60*60*365)
  49. }
  50. func ZoomUrl(obj, s string) (string, error) {
  51. if strutils.HasBlank(obj) {
  52. log.Println("oss发现违规参数")
  53. return "", nil
  54. }
  55. return Bkt.SignURL(pfx+obj, oss.HTTPGet, 60, oss.Process(s))
  56. }
  57. func ZoomUrlPfx(obj, s string, addPfx bool) (string, error) {
  58. if strutils.HasBlank(obj) {
  59. log.Println("oss发现违规参数")
  60. return "", nil
  61. }
  62. if addPfx {
  63. return Bkt.SignURL(pfx+obj, oss.HTTPGet, 60, oss.Process(s))
  64. }
  65. return Bkt.SignURL(obj, oss.HTTPGet, 60, oss.Process(s))
  66. }
  67. func Exist(obj string) (bool, error) {
  68. if strutils.HasBlank(obj) {
  69. return false, nil
  70. }
  71. return Bkt.IsObjectExist(pfx + obj)
  72. }
  73. func Rm(objs ...string) error {
  74. L := len(objs)
  75. if L == 0 {
  76. return nil
  77. }
  78. result, err := Bkt.DeleteObjects(objs)
  79. if err != nil {
  80. return err
  81. }
  82. if len(result.DeletedObjects) != L {
  83. go func() {
  84. // 日志打印哪些Obj删除失败
  85. sucMap := make(map[string]struct{}, len(result.DeletedObjects))
  86. for _, deleted := range result.DeletedObjects {
  87. sucMap[deleted] = struct{}{}
  88. }
  89. for _, obj := range objs {
  90. if _, ok := sucMap[obj]; !ok {
  91. log.Println("Oss删除%s图片失败")
  92. }
  93. }
  94. }()
  95. }
  96. return nil
  97. }
  98. func Ls(dir string) ([]string, error) {
  99. if strutils.HasBlank(dir) {
  100. return []string{}, nil
  101. }
  102. v2, err := Bkt.ListObjectsV2(oss.Prefix(pfx + dir))
  103. if err != nil {
  104. return nil, err
  105. }
  106. ks := make([]string, len(v2.Objects))
  107. for i, obj := range v2.Objects {
  108. ks[i] = obj.Key
  109. }
  110. return ks, nil
  111. }
  112. func LsWithoutPrefix(dir string) ([]string, error) {
  113. if strutils.HasBlank(dir) {
  114. return []string{}, nil
  115. }
  116. v2, err := Bkt.ListObjectsV2(oss.Prefix(dir))
  117. if err != nil {
  118. return nil, err
  119. }
  120. ks := make([]string, len(v2.Objects))
  121. for i, obj := range v2.Objects {
  122. ks[i] = obj.Key
  123. }
  124. return ks, nil
  125. }
  126. type ObjectInfo struct {
  127. Key string
  128. Type string
  129. Size int64
  130. }
  131. func LsDetails(dir string) ([]ObjectInfo, error) {
  132. if strutils.HasBlank(dir) {
  133. return []ObjectInfo{}, nil
  134. }
  135. v2, err := Bkt.ListObjectsV2(oss.Prefix(pfx + dir))
  136. if err != nil {
  137. return nil, err
  138. }
  139. ks := make([]ObjectInfo, len(v2.Objects))
  140. for i, obj := range v2.Objects {
  141. ks[i] = ObjectInfo{
  142. Key: obj.Key,
  143. Type: obj.Type,
  144. Size: obj.Size,
  145. }
  146. }
  147. return ks, nil
  148. }
  149. func Mv(f, t string) error {
  150. if err := Cp(f, t); err != nil {
  151. return err
  152. }
  153. return Bkt.DeleteObject(pfx + f)
  154. }
  155. func CpOrigin(f, t string) error {
  156. _, err := Bkt.CopyObject(f, t)
  157. return err
  158. }
  159. func Cp(f, t string) error {
  160. return CpOrigin(pfx+f, pfx+t)
  161. }
  162. func TouchFormatImg(reader io.Reader, to string) error {
  163. if reader == nil || strutils.HasBlank(to) {
  164. log.Println("oss上传发现违规参数")
  165. return nil
  166. }
  167. return Bkt.PutObject(pfx+to, reader, oss.ContentType("image/jpg"))
  168. }
  169. func GetObjectBytes(obj string) ([]byte, error) {
  170. if strutils.HasBlank(obj) {
  171. return nil, errors.New("参数错误")
  172. }
  173. buf := new(bytes.Buffer)
  174. body, err := Bkt.GetObject(pfx + obj)
  175. if err != nil {
  176. return nil, err
  177. }
  178. _, err = io.Copy(buf, body)
  179. if err != nil {
  180. return nil, err
  181. }
  182. err = body.Close()
  183. if err != nil {
  184. return nil, err
  185. }
  186. return buf.Bytes(), nil
  187. }
  188. func MvWithoutPrefix(f, t string) error {
  189. if _, err := Bkt.CopyObject(f, t); err != nil {
  190. return err
  191. }
  192. return Bkt.DeleteObject(f)
  193. }