oss.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package entity
  2. import (
  3. "crypto/rand"
  4. "crypto/sha256"
  5. "fmt"
  6. "io"
  7. "math/big"
  8. "net/url"
  9. "os"
  10. "path/filepath"
  11. "app.yhyue.com/moapp/jybase/common"
  12. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. )
  16. var Ossclient *oss.Client
  17. func OssInit(ossEndpoint, ossAccessKeyID, ossAccessKeySecret string) {
  18. client, err := oss.New(ossEndpoint, ossAccessKeyID, ossAccessKeySecret)
  19. if err != nil {
  20. logx.Error("Error:", err)
  21. os.Exit(-1)
  22. }
  23. Ossclient = client
  24. }
  25. // OssPutObject oss附件上传
  26. func OssPutObject(objectName string, fd io.Reader, ossBucketName string) (bool, error) {
  27. defer common.Catch()
  28. // 获取存储空间。
  29. bucket, err := Ossclient.Bucket(ossBucketName)
  30. if err != nil {
  31. logx.Error("Error:", err)
  32. return false, err
  33. }
  34. fileNameOnly := GetFileNameOnly(objectName)
  35. fileExtension := TypeByExt(objectName)
  36. option := []oss.Option{
  37. // oss.ContentDisposition("attachment;filename=" + objectName),
  38. oss.ContentDisposition("attachment;filename=" + fileNameOnly + "." + fileExtension + ";filename*=UTF-8''" + url.QueryEscape(fileNameOnly) + "." + fileExtension),
  39. oss.ContentType("application/octet-stream"),
  40. oss.ACReqHeaders("Access-Control-Allow-Origin"),
  41. oss.ACReqMethod("*"),
  42. }
  43. // 上传文件流。 文件超过1M 上传时间超时(发现是受控制台日志打印影响,现已把日志单独处理,注释协程)
  44. err = bucket.PutObject(objectName, fd, option...)
  45. if err != nil {
  46. logx.Error("file upload false:", err)
  47. return false, err
  48. }
  49. return true, nil
  50. }
  51. //删除附件
  52. func OssDelObject(objectName, ossBucketName string) (bool, error) {
  53. defer common.Catch()
  54. // 获取存储信息
  55. bucket, err := Ossclient.Bucket(ossBucketName)
  56. if err != nil {
  57. logx.Error("Error:", err)
  58. return false, err
  59. }
  60. //附件是否存在 存在再删除
  61. if ok, _ := bucket.IsObjectExist(objectName); !ok {
  62. err = bucket.DeleteObject(objectName)
  63. if err != nil {
  64. logx.Error("file del false:", err)
  65. return false, err
  66. }
  67. }
  68. return true, err
  69. }
  70. func GetHashKey(bs []byte) string {
  71. defer common.Catch()
  72. ha := sha256.New()
  73. ha.Write(bs)
  74. hbs := ha.Sum(nil)
  75. key := fmt.Sprintf("%x", hbs)
  76. return key
  77. }
  78. func TypeByExt(path string) string {
  79. for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- {
  80. if path[i] == '.' {
  81. return path[i:]
  82. }
  83. }
  84. return ""
  85. }
  86. //GetFileNameOnly 获取文件名称(不带后缀)
  87. func GetFileNameOnly(filename string) string {
  88. extension := filepath.Ext(filename)
  89. fileNameOnly := filename[0 : len(filename)-len(extension)]
  90. return fileNameOnly
  91. }
  92. //GetRando 获取随机数
  93. func GetRando() string {
  94. randomNumber, err := rand.Int(rand.Reader, big.NewInt(90))
  95. if err != nil {
  96. return "00"
  97. }
  98. return gconv.String(randomNumber.Int64() + 10)
  99. }