修复大文件上传的bug 🐛
This commit is contained in:
parent
e751e13afd
commit
2b313fe3d8
40
caller.go
40
caller.go
@ -2,6 +2,7 @@ package openwechat
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -188,10 +189,8 @@ func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info
|
|||||||
|
|
||||||
// 发送消息接口
|
// 发送消息接口
|
||||||
func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*SentMessage, error) {
|
func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*SentMessage, error) {
|
||||||
resp := NewReturnResponse(c.Client.WebWxSendMsg(msg, info, request))
|
resp, err := c.Client.WebWxSendMsg(msg, info, request)
|
||||||
sendSuccessMsg := &SentMessage{SendMessage: msg}
|
return getSuccessSentMessage(msg, resp, err)
|
||||||
err := parseMessageResponseError(resp, sendSuccessMsg)
|
|
||||||
return sendSuccessMsg, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改用户备注接口
|
// 修改用户备注接口
|
||||||
@ -200,9 +199,9 @@ func (c *Caller) WebWxOplog(request *BaseRequest, remarkName, toUserName string)
|
|||||||
return parseBaseResponseError(resp)
|
return parseBaseResponseError(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName, mediaType string) (*UploadResponse, error) {
|
func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*UploadResponse, error) {
|
||||||
// 首先尝试上传图片
|
// 首先尝试上传图片
|
||||||
resp := NewReturnResponse(c.Client.WebWxUploadMediaByChunk(file, request, info, fromUserName, toUserName, mediaType))
|
resp := NewReturnResponse(c.Client.WebWxUploadMediaByChunk(file, request, info, fromUserName, toUserName))
|
||||||
// 无错误上传成功之后获取请求结果,判断结果是否正常
|
// 无错误上传成功之后获取请求结果,判断结果是否正常
|
||||||
if resp.Err() != nil {
|
if resp.Err() != nil {
|
||||||
return nil, resp.Err()
|
return nil, resp.Err()
|
||||||
@ -226,39 +225,37 @@ func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInf
|
|||||||
// 发送图片消息接口
|
// 发送图片消息接口
|
||||||
func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
||||||
// 首先尝试上传图片
|
// 首先尝试上传图片
|
||||||
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName, "pic")
|
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// 构造新的图片类型的信息
|
// 构造新的图片类型的信息
|
||||||
msg := NewMediaSendMessage(ImageMessage, fromUserName, toUserName, resp.MediaId)
|
msg := NewMediaSendMessage(ImageMessage, fromUserName, toUserName, resp.MediaId)
|
||||||
// 发送图片信息
|
// 发送图片信息
|
||||||
return c.WebWxSendAppMsg(msg, request, info)
|
resp1, err := c.Client.WebWxSendMsgImg(msg, request, info)
|
||||||
|
return getSuccessSentMessage(msg, resp1, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
|
||||||
resp, err := c.UploadMedia(file, req, info, fromUserName, toUserName, "doc")
|
resp, err := c.UploadMedia(file, req, info, fromUserName, toUserName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// 构造新的图片类型的信息
|
// 构造新的文件类型的信息
|
||||||
msg := NewMediaSendMessage(ImageMessage, fromUserName, toUserName, resp.MediaId)
|
|
||||||
stat, _ := file.Stat()
|
stat, _ := file.Stat()
|
||||||
appMsg := NewFileAppMessage(stat, resp.MediaId)
|
appMsg := NewFileAppMessage(stat, resp.MediaId)
|
||||||
content, err := appMsg.XmlByte()
|
content, err := appMsg.XmlByte()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
msg.Content = string(content)
|
msg := NewSendMessage(AppMessage, string(content), fromUserName, toUserName, "")
|
||||||
return c.WebWxSendAppMsg(msg, req, info)
|
return c.WebWxSendAppMsg(msg, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送媒体消息
|
// 发送媒体消息
|
||||||
func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest, info *LoginInfo) (*SentMessage, error) {
|
func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest) (*SentMessage, error) {
|
||||||
resp := NewReturnResponse(c.Client.WebWxSendMsgImg(msg, req, info))
|
resp, err := c.Client.WebWxSendAppMsg(msg, req)
|
||||||
sendSuccessMsg := &SentMessage{SendMessage: msg}
|
return getSuccessSentMessage(msg, resp, err)
|
||||||
err := parseMessageResponseError(resp, sendSuccessMsg)
|
|
||||||
return sendSuccessMsg, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户退出
|
// 用户退出
|
||||||
@ -333,3 +330,10 @@ func parseMessageResponseError(resp *ReturnResponse, msg *SentMessage) error {
|
|||||||
msg.MsgId = messageResp.MsgID
|
msg.MsgId = messageResp.MsgID
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSuccessSentMessage(msg *SendMessage, resp *http.Response, err error) (*SentMessage, error) {
|
||||||
|
returnResp := NewReturnResponse(resp, err)
|
||||||
|
sendSuccessMsg := &SentMessage{SendMessage: msg}
|
||||||
|
err = parseMessageResponseError(returnResp, sendSuccessMsg)
|
||||||
|
return sendSuccessMsg, err
|
||||||
|
}
|
||||||
|
@ -230,6 +230,8 @@ func (c *Client) sendMessage(request *BaseRequest, url string, msg *SendMessage)
|
|||||||
body, _ := ToBuffer(content)
|
body, _ := ToBuffer(content)
|
||||||
req, _ := http.NewRequest(http.MethodPost, url, body)
|
req, _ := http.NewRequest(http.MethodPost, url, body)
|
||||||
req.Header.Add("Content-Type", jsonContentType)
|
req.Header.Add("Content-Type", jsonContentType)
|
||||||
|
fmt.Println(6666)
|
||||||
|
fmt.Println(body.String())
|
||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +253,7 @@ func (c *Client) WebWxGetHeadImg(headImageUrl string) (*http.Response, error) {
|
|||||||
return c.Do(req)
|
return c.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, info *LoginInfo, forUserName, toUserName, mediaType string) (*http.Response, error) {
|
func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, info *LoginInfo, forUserName, toUserName string) (*http.Response, error) {
|
||||||
// 获取文件上传的类型
|
// 获取文件上传的类型
|
||||||
contentType, err := GetFileContentType(file)
|
contentType, err := GetFileContentType(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -276,6 +278,9 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取文件的类型
|
||||||
|
mediaType := getMessageType(sate.Name())
|
||||||
|
|
||||||
path, _ := url.Parse(c.webWxUpLoadMediaUrl)
|
path, _ := url.Parse(c.webWxUpLoadMediaUrl)
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
params.Add("f", "json")
|
params.Add("f", "json")
|
||||||
|
@ -115,3 +115,12 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const TimeFormat = "Mon Jan 02 2006 15:04:05 GMT+0800 (中国标准时间)"
|
const TimeFormat = "Mon Jan 02 2006 15:04:05 GMT+0800 (中国标准时间)"
|
||||||
|
|
||||||
|
var imageType = map[string]bool{
|
||||||
|
"bmp": true,
|
||||||
|
"png": true,
|
||||||
|
"jpeg": true,
|
||||||
|
"jpg": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
var videoType = "mp4"
|
||||||
|
32
message.go
32
message.go
@ -336,7 +336,7 @@ type SendMessage struct {
|
|||||||
ToUserName string
|
ToUserName string
|
||||||
LocalID string
|
LocalID string
|
||||||
ClientMsgId string
|
ClientMsgId string
|
||||||
MediaId string
|
MediaId string `json:"MediaId,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage的构造方法
|
// SendMessage的构造方法
|
||||||
@ -472,18 +472,17 @@ func (s *SentMessage) Revoke() error {
|
|||||||
return s.Self.RevokeMessage(s)
|
return s.Self.RevokeMessage(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
type FileAppMessage struct {
|
type appmsg struct {
|
||||||
AppMsg xml.Name `xml:"appmsg"`
|
Type int `xml:"type"`
|
||||||
Type int `xml:"type"`
|
AppId string `xml:"appid,attr"` // wxeb7ec651dd0aefa9
|
||||||
AppId string `xml:"appid,attr"` // wxeb7ec651dd0aefa9
|
SdkVer string `xml:"sdkver,attr"`
|
||||||
SdkVer string `xml:"sdkver,attr"`
|
Title string `xml:"title"`
|
||||||
Title string `xml:"title"`
|
Des string `xml:"des"`
|
||||||
Des string `xml:"des"`
|
Action string `xml:"action"`
|
||||||
Action string `xml:"action"`
|
Content string `xml:"content"`
|
||||||
Content string `xml:"content"`
|
Url string `xml:"url"`
|
||||||
Url string `xml:"url"`
|
LowUrl string `xml:"lowurl"`
|
||||||
LowUrl string `xml:"lowurl"`
|
ExtInfo string `xml:"extinfo"`
|
||||||
ExtInfo string `xml:"extinfo"`
|
|
||||||
AppAttach struct {
|
AppAttach struct {
|
||||||
TotalLen int64 `xml:"totallen"`
|
TotalLen int64 `xml:"totallen"`
|
||||||
AttachId string `xml:"attachid"`
|
AttachId string `xml:"attachid"`
|
||||||
@ -491,14 +490,15 @@ type FileAppMessage struct {
|
|||||||
} `xml:"appattach"`
|
} `xml:"appattach"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f FileAppMessage) XmlByte() ([]byte, error) {
|
func (f appmsg) XmlByte() ([]byte, error) {
|
||||||
return xml.Marshal(f)
|
return xml.Marshal(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFileAppMessage(stat os.FileInfo, attachId string) *FileAppMessage {
|
func NewFileAppMessage(stat os.FileInfo, attachId string) *appmsg {
|
||||||
m := &FileAppMessage{AppId: "wxeb7ec651dd0aefa9", Title: stat.Name()}
|
m := &appmsg{AppId: "wxeb7ec651dd0aefa9", Title: stat.Name()}
|
||||||
m.AppAttach.AttachId = attachId
|
m.AppAttach.AttachId = attachId
|
||||||
m.AppAttach.TotalLen = stat.Size()
|
m.AppAttach.TotalLen = stat.Size()
|
||||||
|
m.Type = 6
|
||||||
m.AppAttach.FileExt = getFileExt(stat.Name())
|
m.AppAttach.FileExt = getFileExt(stat.Name())
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
30
parser.go
30
parser.go
@ -12,11 +12,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func ToBuffer(v interface{}) (*bytes.Buffer, error) {
|
func ToBuffer(v interface{}) (*bytes.Buffer, error) {
|
||||||
buf, err := json.Marshal(v)
|
var buffer bytes.Buffer
|
||||||
if err != nil {
|
encoder := json.NewEncoder(&buffer)
|
||||||
return nil, err
|
// 这里要设置进制html转义
|
||||||
}
|
encoder.SetEscapeHTML(false)
|
||||||
return bytes.NewBuffer(buf), nil
|
err := encoder.Encode(v)
|
||||||
|
return &buffer, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取随机设备id
|
// 获取随机设备id
|
||||||
@ -67,8 +68,25 @@ func GetFileContentType(file multipart.File) (string, error) {
|
|||||||
|
|
||||||
func getFileExt(name string) string {
|
func getFileExt(name string) string {
|
||||||
results := strings.Split(name, ".")
|
results := strings.Split(name, ".")
|
||||||
if len(results) == 0 {
|
if len(results) == 1 {
|
||||||
return "undefined"
|
return "undefined"
|
||||||
}
|
}
|
||||||
return results[len(results)-1]
|
return results[len(results)-1]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
pic = "pic"
|
||||||
|
video = "video"
|
||||||
|
doc = "doc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 微信匹配文件类型策略
|
||||||
|
func getMessageType(filename string) string {
|
||||||
|
ext := getFileExt(filename)
|
||||||
|
if imageType[ext] {
|
||||||
|
return pic
|
||||||
|
} else if ext == videoType {
|
||||||
|
return video
|
||||||
|
}
|
||||||
|
return doc
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user