Skip to content

Commit 807a8a1

Browse files
committed
Merge branch 'feature_add_stream_upload' into v2
# Conflicts: # officialaccount/material/material.go # util/http.go
2 parents 05ac714 + 3b888dd commit 807a8a1

File tree

7 files changed

+73
-54
lines changed

7 files changed

+73
-54
lines changed

miniprogram/content/content.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,12 @@ func (content *Content) CheckImage(media string) error {
5353
if err != nil {
5454
return err
5555
}
56+
var directory = media
5657
response, err := util.PostFile(
5758
"media",
58-
media,
59+
nil,
60+
"",
61+
directory,
5962
fmt.Sprintf(checkImageURL, accessToken),
6063
)
6164
if err != nil {

miniprogram/security/security.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ func (security *Security) ImageCheckV1(filename string) (err error) {
102102
}
103103

104104
uri := fmt.Sprintf(imageCheckURL, accessToken)
105-
response, err := util.PostFile("media", filename, uri)
105+
var directory = filename
106+
response, err := util.PostFile("media", nil, "", directory, uri)
106107
if err != nil {
107108
return
108109
}

officialaccount/customerservice/manager.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ func (csm *Manager) UploadHeadImg(kfAccount, fileName string) (err error) {
212212
}
213213
uri := fmt.Sprintf("%s?access_token=%s&kf_account=%s", customerServiceUploadHeadImg, accessToken, kfAccount)
214214
var response []byte
215-
response, err = util.PostFile("media", fileName, uri)
215+
var directory = fileName
216+
response, err = util.PostFile("media", nil, "", directory, uri)
216217
if err != nil {
217218
return
218219
}

officialaccount/material/material.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ type resAddMaterial struct {
163163
}
164164

165165
// AddMaterialFromReader 上传永久性素材(处理视频需要单独上传),从 io.Reader 中读取
166-
func (material *Material) AddMaterialFromReader(mediaType MediaType, filename string, reader io.Reader) (mediaID string, url string, err error) {
166+
func (material *Material) AddMaterialFromReader(mediaType MediaType, filename string) (mediaID string, url string, err error) {
167167
if mediaType == MediaTypeVideo {
168168
err = errors.New("永久视频素材上传使用 AddVideo 方法")
169169
return

officialaccount/material/media.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package material
33
import (
44
"encoding/json"
55
"fmt"
6+
"io"
7+
"net/http"
8+
"strings"
69

710
"github.com/silenceper/wechat/v2/util"
811
)
@@ -38,16 +41,32 @@ type Media struct {
3841
}
3942

4043
// MediaUpload 临时素材上传
41-
func (material *Material) MediaUpload(mediaType MediaType, filename string) (media Media, err error) {
44+
func (material *Material) MediaUpload(mediaType MediaType, url string) (media Media, err error) {
4245
var accessToken string
43-
accessToken, err = material.GetAccessToken()
44-
if err != nil {
46+
if accessToken, err = material.GetAccessToken(); err != nil {
4547
return
4648
}
47-
4849
uri := fmt.Sprintf("%s?access_token=%s&type=%s", mediaUploadURL, accessToken, mediaType)
50+
// 使用strings.LastIndex函数找到最后一个斜杠的位置
51+
lastSlashIndex := strings.LastIndex(url, "/")
52+
// 从最后一个斜杠的位置截取到最后,获取文件名
53+
filename := url[lastSlashIndex+1:]
54+
// 获取资源
55+
resp, err := http.Get(url)
56+
if err != nil {
57+
err = fmt.Errorf("get image error: %v", err)
58+
return
59+
}
60+
// 读取响应到内存
61+
var imageData []byte
62+
imageData, err = io.ReadAll(resp.Body)
63+
defer resp.Body.Close()
64+
if err != nil {
65+
err = fmt.Errorf("read image error: %v", err)
66+
return
67+
}
4968
var response []byte
50-
response, err = util.PostFile("media", filename, uri)
69+
response, err = util.PostFile("media", imageData, filename, "", uri)
5170
if err != nil {
5271
return
5372
}
@@ -56,7 +75,7 @@ func (material *Material) MediaUpload(mediaType MediaType, filename string) (med
5675
return
5776
}
5877
if media.ErrCode != 0 {
59-
err = fmt.Errorf("MediaUpload error : errcode=%v , errmsg=%v", media.ErrCode, media.ErrMsg)
78+
err = fmt.Errorf("MediaUpload error : errcode=%v, errmsg=%v", media.ErrCode, media.ErrMsg)
6079
return
6180
}
6281
return
@@ -91,7 +110,8 @@ func (material *Material) ImageUpload(filename string) (url string, err error) {
91110

92111
uri := fmt.Sprintf("%s?access_token=%s", mediaUploadImageURL, accessToken)
93112
var response []byte
94-
response, err = util.PostFile("media", filename, uri)
113+
var directory = filename
114+
response, err = util.PostFile("media", nil, "", directory, uri)
95115
if err != nil {
96116
return
97117
}

util/http.go

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -146,38 +146,35 @@ func PostJSONWithRespContentType(uri string, obj interface{}) ([]byte, string, e
146146
return responseData, contentType, err
147147
}
148148

149-
// PostFile 上传文件
150-
func PostFile(fieldName, filename, uri string) ([]byte, error) {
151-
fields := []MultipartFormField{
152-
{
153-
IsFile: true,
154-
Fieldname: fieldName,
155-
Filename: filename,
156-
},
149+
// PostFile 支持流或文件形式上传
150+
func PostFile(fieldName string, data []byte, fileName string, directory string, uri string) ([]byte, error) {
151+
var fileContent []byte
152+
var isFile bool
153+
// 数据为空且文件目录不为空则按文件形式上传
154+
if len(data) == 0 && directory != "" {
155+
isFile = true
156+
} else {
157+
fileContent = data
157158
}
158-
return PostMultipartForm(fields, uri)
159-
}
160-
161-
// PostFileFromReader 上传文件,从 io.Reader 中读取
162-
func PostFileFromReader(filedName, fileName, uri string, reader io.Reader) ([]byte, error) {
163159
fields := []MultipartFormField{
164160
{
165-
IsFile: true,
166-
Fieldname: filedName,
167-
Filename: fileName,
168-
FileReader: reader,
161+
IsFile: isFile,
162+
Fieldname: fieldName,
163+
Value: fileContent,
164+
Filename: fileName,
165+
Directory: directory,
169166
},
170167
}
171168
return PostMultipartForm(fields, uri)
172169
}
173170

174171
// MultipartFormField 保存文件或其他字段信息
175172
type MultipartFormField struct {
176-
IsFile bool
177-
Fieldname string
178-
Value []byte
179-
Filename string
180-
FileReader io.Reader
173+
IsFile bool
174+
Fieldname string
175+
Value []byte
176+
Filename string
177+
Directory string
181178
}
182179

183180
// PostMultipartForm 上传文件或其他多个字段
@@ -190,30 +187,24 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
190187

191188
for _, field := range fields {
192189
if field.IsFile {
193-
fileWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Filename)
190+
fileWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Directory)
194191
if e != nil {
195192
err = fmt.Errorf("error writing to buffer , err=%v", e)
196193
return
197194
}
198195

199-
if field.FileReader == nil {
200-
fh, e := os.Open(field.Filename)
201-
if e != nil {
202-
err = fmt.Errorf("error opening file , err=%v", e)
203-
return
204-
}
205-
_, err = io.Copy(fileWriter, fh)
206-
_ = fh.Close()
207-
if err != nil {
208-
return
209-
}
210-
} else {
211-
if _, err = io.Copy(fileWriter, field.FileReader); err != nil {
212-
return
213-
}
196+
fh, e := os.Open(field.Directory)
197+
if e != nil {
198+
err = fmt.Errorf("error opening file , err=%v", e)
199+
return
200+
}
201+
defer fh.Close()
202+
203+
if _, err = io.Copy(fileWriter, fh); err != nil {
204+
return
214205
}
215206
} else {
216-
partWriter, e := bodyWriter.CreateFormField(field.Fieldname)
207+
partWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Filename)
217208
if e != nil {
218209
err = e
219210
return
@@ -235,7 +226,7 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
235226
}
236227
defer resp.Body.Close()
237228
if resp.StatusCode != http.StatusOK {
238-
return nil, fmt.Errorf("http code error : uri=%v , statusCode=%v", uri, resp.StatusCode)
229+
return nil, err
239230
}
240231
respBody, err = io.ReadAll(resp.Body)
241232
return

work/material/media.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ func (r *Client) UploadImg(filename string) (*UploadImgResponse, error) {
4848
return nil, err
4949
}
5050
var response []byte
51-
if response, err = util.PostFile("media", filename, fmt.Sprintf(uploadImgURL, accessToken)); err != nil {
51+
var directory = filename
52+
if response, err = util.PostFile("media", nil, "", directory, fmt.Sprintf(uploadImgURL, accessToken)); err != nil {
5253
return nil, err
5354
}
5455
result := &UploadImgResponse{}
@@ -68,7 +69,8 @@ func (r *Client) UploadTempFile(filename string, mediaType string) (*UploadTempF
6869
return nil, err
6970
}
7071
var response []byte
71-
if response, err = util.PostFile("media", filename, fmt.Sprintf(uploadTempFile, accessToken, mediaType)); err != nil {
72+
var directory = filename
73+
if response, err = util.PostFile("media", nil, "", directory, fmt.Sprintf(uploadTempFile, accessToken, mediaType)); err != nil {
7274
return nil, err
7375
}
7476
result := &UploadTempFileResponse{}
@@ -89,7 +91,8 @@ func (r *Client) UploadAttachment(filename string, mediaType string, attachmentT
8991
return nil, err
9092
}
9193
var response []byte
92-
if response, err = util.PostFile("media", filename, fmt.Sprintf(uploadAttachment, accessToken, mediaType, attachmentType)); err != nil {
94+
var directory = filename
95+
if response, err = util.PostFile("media", nil, "", directory, fmt.Sprintf(uploadTempFile, accessToken, mediaType)); err != nil {
9396
return nil, err
9497
}
9598
result := &UploadAttachmentResponse{}

0 commit comments

Comments
 (0)