up_nas.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package dao
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "mime/multipart"
  10. "net/http"
  11. "net/url"
  12. "strconv"
  13. "strings"
  14. "time"
  15. "crypto/md5"
  16. "encoding/hex"
  17. "go-common/app/admin/main/appstatic/conf"
  18. "go-common/app/admin/main/appstatic/model"
  19. "go-common/library/log"
  20. )
  21. // Sign fn
  22. func Sign(params url.Values) (query string, err error) {
  23. if len(params) == 0 {
  24. return
  25. }
  26. if params.Get("appkey") == "" {
  27. err = fmt.Errorf("utils http get must have parameter appkey")
  28. return
  29. }
  30. if params.Get("appsecret") == "" {
  31. err = fmt.Errorf("utils http get must have parameter appsecret")
  32. return
  33. }
  34. if params.Get("sign") != "" {
  35. err = fmt.Errorf("utils http get must have not parameter sign")
  36. return
  37. }
  38. // sign
  39. secret := params.Get("appsecret")
  40. params.Del("appsecret")
  41. tmp := params.Encode()
  42. if strings.IndexByte(tmp, '+') > -1 {
  43. tmp = strings.Replace(tmp, "+", "%20", -1)
  44. }
  45. mh := md5.Sum([]byte(tmp + secret))
  46. params.Set("sign", hex.EncodeToString(mh[:]))
  47. query = params.Encode()
  48. return
  49. }
  50. // get sign for NAS storage
  51. func getSign(nas *conf.Bfs) (uri string, err error) {
  52. var (
  53. params = url.Values{}
  54. query string
  55. )
  56. params.Set("appkey", nas.Key)
  57. params.Set("appsecret", nas.Secret)
  58. params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
  59. if query, err = Sign(params); err != nil {
  60. log.Error("UpNAS getSign Error (%s)-(%v)-(%v)", nas, err)
  61. return
  62. }
  63. uri = nas.Host + "?" + query
  64. return
  65. }
  66. // UploadNas can upload the file into Nas Storage
  67. func (d *Dao) UploadNas(c context.Context, fileName string, data []byte, nas *conf.Bfs) (location string, err error) {
  68. var (
  69. req *http.Request
  70. resp *http.Response
  71. client = &http.Client{Timeout: time.Duration(nas.Timeout) * time.Millisecond}
  72. url string
  73. res = model.ResponseNas{}
  74. )
  75. // get sign
  76. if url, err = getSign(nas); err != nil {
  77. log.Error("UpNAS getSign Error (%s)-(%v)-(%v)", nas, err)
  78. return
  79. }
  80. // prepare the data of the file and init the request
  81. buf := new(bytes.Buffer)
  82. bodyWriter := multipart.NewWriter(buf)
  83. fileWriter, err := bodyWriter.CreateFormFile("file", fileName)
  84. if err != nil {
  85. log.Error("UpNAS fileWriter Error (%v)-(%v)", nas, err)
  86. return
  87. }
  88. if _, err = io.Copy(fileWriter, bytes.NewReader(data)); err != nil {
  89. log.Error("UpNAS fileWriter Copy Error (%v)-(%v)", nas, err)
  90. return
  91. }
  92. bodyWriter.Close()
  93. // request setting
  94. if req, err = http.NewRequest(_methodNas, url, buf); err != nil {
  95. log.Error("http.NewRequest() Upload(%v) error(%v)", url, err)
  96. return
  97. }
  98. req.Header.Set("Content-Type", bodyWriter.FormDataContentType())
  99. resp, err = client.Do(req)
  100. // response treatment
  101. if err != nil {
  102. log.Error("Nas client.Do(%s) error(%v)", url, err)
  103. return
  104. }
  105. defer resp.Body.Close()
  106. log.Info("NasAPI returns (%v)", resp)
  107. if resp.StatusCode != http.StatusOK {
  108. err = fmt.Errorf("Nas status code error:%v", resp.StatusCode)
  109. return
  110. }
  111. respBody, err := ioutil.ReadAll(resp.Body)
  112. if err = json.Unmarshal(respBody, &res); err != nil {
  113. log.Error("json.Unmarshal(%s) error(%v)", string(respBody), err)
  114. return
  115. }
  116. log.Info("NasAPI res struct (%v)", res)
  117. location = res.Data
  118. // workaround solution for Macross Upload URL issue
  119. if d.c.Nas.NewURL != "" {
  120. location = strings.Replace(location, d.c.Nas.OldURL, d.c.Nas.NewURL, -1)
  121. log.Error("NasURL replace [%s] to [%s]", res.Data, location)
  122. }
  123. return
  124. }