github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/shakearound/material/add.go (about)

     1  package material
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"net/url"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/chanxuehong/wechat/mp/core"
    11  )
    12  
    13  type ImageInfo struct {
    14  	PicURL string `json:"pic_url"`
    15  }
    16  
    17  func Add(clt *core.Client, imagePath, _type string) (info ImageInfo, err error) {
    18  	file, err := os.Open(imagePath)
    19  	if err != nil {
    20  		return
    21  	}
    22  	defer file.Close()
    23  
    24  	return addFromReader(clt, filepath.Base(imagePath), file, _type)
    25  }
    26  
    27  func AddFromReader(clt *core.Client, filename string, reader io.Reader, _type string) (info ImageInfo, err error) {
    28  	if filename == "" {
    29  		err = errors.New("empty filename")
    30  		return
    31  	}
    32  	if reader == nil {
    33  		err = errors.New("nil reader")
    34  		return
    35  	}
    36  
    37  	return addFromReader(clt, filename, reader, _type)
    38  }
    39  
    40  func addFromReader(clt *core.Client, filename string, reader io.Reader, _type string) (info ImageInfo, err error) {
    41  	var result struct {
    42  		core.Error
    43  		ImageInfo `json:"data"`
    44  	}
    45  
    46  	var incompleteURL string
    47  	if _type != "" {
    48  		incompleteURL = "https://api.weixin.qq.com/shakearound/material/add?type=" + url.QueryEscape(_type) +
    49  			"&access_token="
    50  	} else {
    51  		incompleteURL = "https://api.weixin.qq.com/shakearound/material/add?access_token="
    52  	}
    53  	fields := []core.MultipartFormField{{
    54  		IsFile:   true,
    55  		Name:     "media",
    56  		FileName: filename,
    57  		Value:    reader,
    58  	}}
    59  	if err = clt.PostMultipartForm(incompleteURL, fields, &result); err != nil {
    60  		return
    61  	}
    62  
    63  	if result.ErrCode != core.ErrCodeOK {
    64  		err = &result.Error
    65  		return
    66  	}
    67  	info = result.ImageInfo
    68  	return
    69  }