uploadImg.go 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package wechatimg
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "io/ioutil"
  8. "mime/multipart"
  9. "net/http"
  10. "os"
  11. "path/filepath"
  12. "time"
  13. "wechat-conf/utils"
  14. "github.com/astaxie/beego"
  15. )
  16. const (
  17. WechatUploadMediaAPI = "https://api.weixin.qq.com/cgi-bin/material/add_material"
  18. )
  19. var (
  20. HttpRequstTimeOut time.Duration
  21. )
  22. type MediaUpload struct {
  23. ErrCode int `json:"errcode"`
  24. ErrMgs string `json:"errmsg"`
  25. Type string `json:"type"`
  26. MediaID string `json:"media_id"`
  27. CreatedAt string `json:"created_at"`
  28. }
  29. func init() {
  30. HttpRequstTimeOut, _ = time.ParseDuration("5s")
  31. }
  32. func UploaImage(token, imagePath string) (mediaid string, err error) {
  33. file, err := os.Open(imagePath)
  34. if err != nil {
  35. beego.Error(err)
  36. utils.LogError("上传图片失败:", err)
  37. return
  38. }
  39. defer file.Close()
  40. body := &bytes.Buffer{}
  41. writer := multipart.NewWriter(body)
  42. part, err := writer.CreateFormFile("media", filepath.Base(imagePath))
  43. if err != nil {
  44. beego.Error(err)
  45. utils.LogError("上传图片失败:", err)
  46. return
  47. }
  48. _, err = io.Copy(part, file)
  49. err = writer.Close()
  50. if err != nil {
  51. beego.Error(err)
  52. utils.LogError("上传图片失败:", err)
  53. return
  54. }
  55. req, err := http.NewRequest("POST", WechatUploadMediaAPI, body)
  56. req.Header.Add("Content-Type", writer.FormDataContentType())
  57. urlQuery := req.URL.Query()
  58. if err != nil {
  59. beego.Error(err)
  60. utils.LogError("上传图片失败:", err)
  61. return
  62. }
  63. urlQuery.Add("access_token", token)
  64. urlQuery.Add("type", "image")
  65. req.URL.RawQuery = urlQuery.Encode()
  66. client := http.Client{}
  67. res, err := client.Do(req)
  68. if err != nil {
  69. beego.Error(err)
  70. utils.LogError("上传图片失败:", err)
  71. return
  72. }
  73. defer res.Body.Close()
  74. jsonbody, _ := ioutil.ReadAll(res.Body)
  75. media := MediaUpload{}
  76. err = json.Unmarshal(jsonbody, &media)
  77. if err != nil {
  78. beego.Error(media.ErrMgs)
  79. utils.LogError("上传图片失败:", media.ErrMgs)
  80. return
  81. }
  82. if media.MediaID == "" {
  83. beego.Error(media.ErrMgs)
  84. err = errors.New(media.ErrMgs)
  85. utils.LogError("上传图片失败:", media.ErrMgs)
  86. }
  87. mediaid = media.MediaID
  88. return
  89. }