美文网首页
企业微信API上传临时素材

企业微信API上传临时素材

作者: 杜子龙 | 来源:发表于2019-07-31 19:41 被阅读0次

    官方API文档在此,不过构造请求很坑,其中HttpDo方法的具体实现在此

    func MaterialUploadByData(data []byte, fillType, accessToken, filename string) (res *MaterialResponse) {
        res = &MaterialResponse{}
        contentType := ""
        filenameToLower := strings.ToLower(filename)
        if strings.HasSuffix(filenameToLower, ".jpg") {
            contentType = "image/jpg"
        } else if strings.HasSuffix(filenameToLower, ".png") {
            contentType = "image/png"
        } else if strings.HasSuffix(filenameToLower, ".bmp") {
            contentType = "image/bmp"
        } else if strings.HasSuffix(filenameToLower, ".amr") {
            contentType = "voice/amr"
        } else if strings.HasSuffix(filenameToLower, ".mp4") {
            contentType = "video/mp4"
        } else {
            contentType = "application/octet-stream"
        }
        QYURL := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s", accessToken, fillType)
        BOUNDARY := strconv.FormatInt(time.Now().Unix(), 10)
    
        bodyBuf := bytes.NewBuffer(nil)
        bodyBuf.WriteString(fmt.Sprintf("--%s\r\nContent-Disposition: form-data; name=\"media\";filelength=%s; filename=\"%s\"\r\n"+
            "Content-Type: %s\r\n\r\n",
            BOUNDARY, strconv.Itoa(len(data)), filename, contentType))
        bodyBuf.Write(data)
        bodyBuf.WriteString(fmt.Sprintf("\r\n--%s--\r\n", BOUNDARY))
        req, err := http.NewRequest("POST", QYURL, bodyBuf)
        if err != nil {
            log.Errorf("err = %s", err.Error())
            res.Errcode = -1
            res.Errmsg = err.Error()
            return res
        }
        req.Header.Add("Content-Type", `multipart/form-data; boundary=`+BOUNDARY)
        //req.Header.Add("Content-Length", strconv.Itoa(bodyBuf.Len())) //可以省略
        resStr, err := httputils.HttpDo(req)
        if err != nil {
            log.Errorf("err = %s", err.Error())
            res.Errcode = -1
            res.Errmsg = err.Error()
            return
        }
        err = json.Unmarshal(resStr, res)
        if err != nil {
            log.Errorf("获取mediaId出错,err = %s", err.Error())
            res.Errcode = -1
            res.Errmsg = err.Error()
            return
        }
        return
    }
    type MaterialResponse struct {
        Errcode   int32  `json:"errcode"`
        Errmsg    string `json:"errmsg"`
        MediaId   string `json:"media_id"`
        FillType  string `json:"type"` //分别有图片(image)、语音(voice)、视频(video),普通文件(file)
        CreatedAt string `json:"created_at"`
        Url       string `json:"url"`
    }
    

    相关文章

      网友评论

          本文标题:企业微信API上传临时素材

          本文链接:https://www.haomeiwen.com/subject/evcxdctx.html