package wechatimg import ( "bytes" "encoding/json" "errors" "io" "io/ioutil" "mime/multipart" "net/http" "os" "path/filepath" "time" "wechat-conf/utils" "github.com/astaxie/beego" ) const ( WechatUploadMediaAPI = "https://api.weixin.qq.com/cgi-bin/material/add_material" ) var ( HttpRequstTimeOut time.Duration ) type MediaUpload struct { ErrCode int `json:"errcode"` ErrMgs string `json:"errmsg"` Type string `json:"type"` MediaID string `json:"media_id"` CreatedAt string `json:"created_at"` } func init() { HttpRequstTimeOut, _ = time.ParseDuration("5s") } func UploaImage(token, imagePath string) (mediaid string, err error) { file, err := os.Open(imagePath) if err != nil { beego.Error(err) utils.LogError("上传图片失败:", err) return } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("media", filepath.Base(imagePath)) if err != nil { beego.Error(err) utils.LogError("上传图片失败:", err) return } _, err = io.Copy(part, file) err = writer.Close() if err != nil { beego.Error(err) utils.LogError("上传图片失败:", err) return } req, err := http.NewRequest("POST", WechatUploadMediaAPI, body) req.Header.Add("Content-Type", writer.FormDataContentType()) urlQuery := req.URL.Query() if err != nil { beego.Error(err) utils.LogError("上传图片失败:", err) return } urlQuery.Add("access_token", token) urlQuery.Add("type", "image") req.URL.RawQuery = urlQuery.Encode() client := http.Client{} res, err := client.Do(req) if err != nil { beego.Error(err) utils.LogError("上传图片失败:", err) return } defer res.Body.Close() jsonbody, _ := ioutil.ReadAll(res.Body) media := MediaUpload{} err = json.Unmarshal(jsonbody, &media) if err != nil { beego.Error(media.ErrMgs) utils.LogError("上传图片失败:", media.ErrMgs) return } if media.MediaID == "" { beego.Error(media.ErrMgs) err = errors.New(media.ErrMgs) utils.LogError("上传图片失败:", media.ErrMgs) } mediaid = media.MediaID return }