123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package utils
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "encoding/base64"
  6. "net/http"
  7. "path/filepath"
  8. "strings"
  9. "time"
  10. "github.com/yl10/kit/guid"
  11. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  12. )
  13. // GetOssClient 获取 OSS 客户端
  14. func GetOssClient(endpoint, accessKeyID, accessKeySecret string) (*oss.Client, error) {
  15. return oss.New(endpoint, accessKeyID, accessKeySecret)
  16. }
  17. // UploadFileToBucket 简单上传文件
  18. func UploadFileToBucket(cli *oss.Client, req *http.Request, bucket, fromFront string, nameSuffix ...string) (string, error) {
  19. bkt, err := cli.Bucket(bucket)
  20. if err != nil {
  21. return "", err
  22. }
  23. file, fh, err := req.FormFile(fromFront)
  24. if err != nil {
  25. return "", err
  26. }
  27. defer file.Close()
  28. _, fname := filepath.Split(fh.Filename)
  29. LogInfo("__________________fileName1_________________")
  30. LogInfo(fname)
  31. if len(nameSuffix) > 0 && nameSuffix[0] != "" {
  32. fArr := strings.Split(fname, ".")
  33. fArr[0] = fArr[0] + nameSuffix[0]
  34. fname = strings.Join(fArr, ".")
  35. }
  36. LogInfo("__________________fileName2_________________")
  37. LogInfo(fname)
  38. if req.Header.Get("Content-Encoding") == "gzip" {
  39. reader, err := gzip.NewReader(file)
  40. if err != nil {
  41. return "", err
  42. }
  43. err = bkt.PutObject(fname, reader)
  44. if err != nil {
  45. return "", err
  46. }
  47. } else {
  48. err = bkt.PutObject(fname, file)
  49. if err != nil {
  50. return "", err
  51. }
  52. }
  53. return strings.Join([]string{
  54. "http://",
  55. bucket + ".",
  56. cli.Config.Endpoint + "/",
  57. fname,
  58. }, ""), nil
  59. }
  60. // UploadStringToBucket 上传base64图片
  61. func UploadStringToBucket(cli *oss.Client, bucket, fromStr string) (string, error) {
  62. bkt, err := cli.Bucket(bucket)
  63. if err != nil {
  64. return "", err
  65. }
  66. imgName := guid.NewGUIDString() + "-" + time.Now().Local().Format("20060102150405")
  67. imgExt := ".jpg"
  68. switch getMIMEFromBase64(fromStr) {
  69. case "image/gif":
  70. imgExt = ".gif"
  71. case "image/bmp":
  72. imgExt = ".bmp"
  73. case "image/png", "image/x-png":
  74. imgExt = ".png"
  75. case "image/pipeg":
  76. imgExt = ".jfif"
  77. case "image/webp":
  78. imgExt = ".webp"
  79. }
  80. fName := imgName + imgExt
  81. imgData, err := base64.StdEncoding.DecodeString(strings.Split(fromStr, "base64,")[1])
  82. if err != nil {
  83. return "", err
  84. }
  85. err = bkt.PutObject(fName, bytes.NewBuffer(imgData))
  86. if err != nil {
  87. return "", err
  88. }
  89. return strings.Join([]string{
  90. "http://",
  91. bucket + ".",
  92. cli.Config.Endpoint + "/",
  93. fName,
  94. }, ""), nil
  95. }
  96. // utils
  97. // getMIMEFromBase64 获取 base64 字串中的 mime
  98. func getMIMEFromBase64(str string) string {
  99. g := strings.Split(str, ";")
  100. if len(g) < 2 {
  101. return ""
  102. }
  103. return strings.ToLower(strings.TrimLeft(g[0], "data:"))
  104. }