From 66c4bebd1f824ffa7262e86b7aa2c02ebd0bd740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9A=E5=90=83=E7=82=B9=E8=8B=B9=E6=9E=9C?= <73388495+eatmoreapple@users.noreply.github.com> Date: Fri, 3 Feb 2023 22:17:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E5=8D=87=E4=B8=8A=E4=BC=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=80=A7=E8=83=BD=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/client.go b/client.go index eef9299..bd50cd2 100644 --- a/client.go +++ b/client.go @@ -314,6 +314,8 @@ func (c *Client) WebWxGetHeadImg(user *User) (*http.Response, error) { return c.Do(req) } +// WebWxUploadMediaByChunk 分块上传文件 +// TODO 优化掉这个函数 func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, info *LoginInfo, forUserName, toUserName string) (*http.Response, error) { // 获取文件上传的类型 contentType, err := GetFileContentType(file) @@ -410,16 +412,17 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in return nil, err } + var chunkBuff = make([]byte, chunkSize) + + var formBuffer = bytes.NewBuffer(nil) + // 分块上传 for chunk := 0; int64(chunk) < chunks; chunk++ { - - isLastTime := int64(chunk)+1 == chunks - if chunks > 1 { content["chunk"] = strconv.Itoa(chunk) } - var formBuffer = bytes.NewBuffer(nil) + formBuffer.Reset() writer := multipart.NewWriter(formBuffer) @@ -434,34 +437,33 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in } w, err := writer.CreateFormFile("filename", file.Name()) - if err != nil { return nil, err } - chunkData := make([]byte, chunkSize) - - n, err := file.Read(chunkData) + n, err := file.Read(chunkBuff) if err != nil && err != io.EOF { return nil, err } - - if _, err = w.Write(chunkData[:n]); err != nil { + if _, err = w.Write(chunkBuff[:n]); err != nil { return nil, err } - ct := writer.FormDataContentType() if err = writer.Close(); err != nil { return nil, err } + req, _ := http.NewRequest(http.MethodPost, path.String(), formBuffer) req.Header.Set("Content-Type", ct) + // 发送数据 resp, err = c.Do(req) if err != nil { return nil, err } + + isLastTime := int64(chunk)+1 == chunks // 如果不是最后一次, 解析有没有错误 if !isLastTime { parser := MessageResponseParser{Reader: resp.Body}