Skip to content

Commit 2885487

Browse files
committed
新增支持流的形式上传方式
1 parent 1138a7d commit 2885487

File tree

6 files changed

+55
-18
lines changed

6 files changed

+55
-18
lines changed

miniprogram/content/content.go

+4-1
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

+2-1
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

+2-1
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

+2-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ func (material *Material) AddMaterial(mediaType MediaType, filename string) (med
174174

175175
uri := fmt.Sprintf("%s?access_token=%s&type=%s", addMaterialURL, accessToken, mediaType)
176176
var response []byte
177-
response, err = util.PostFile("media", filename, uri)
177+
var directory = filename
178+
response, err = util.PostFile("media", nil, "", directory, uri)
178179
if err != nil {
179180
return
180181
}

officialaccount/material/media.go

+27-7
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

+18-7
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,23 @@ 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) {
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
158+
}
151159
fields := []MultipartFormField{
152160
{
153-
IsFile: true,
161+
IsFile: isFile,
154162
Fieldname: fieldName,
155-
Filename: filename,
163+
Value: fileContent,
164+
Filename: fileName,
165+
Directory: directory,
156166
},
157167
}
158168
return PostMultipartForm(fields, uri)
@@ -164,6 +174,7 @@ type MultipartFormField struct {
164174
Fieldname string
165175
Value []byte
166176
Filename string
177+
Directory string
167178
}
168179

169180
// PostMultipartForm 上传文件或其他多个字段
@@ -176,13 +187,13 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
176187

177188
for _, field := range fields {
178189
if field.IsFile {
179-
fileWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Filename)
190+
fileWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Directory)
180191
if e != nil {
181192
err = fmt.Errorf("error writing to buffer , err=%v", e)
182193
return
183194
}
184195

185-
fh, e := os.Open(field.Filename)
196+
fh, e := os.Open(field.Directory)
186197
if e != nil {
187198
err = fmt.Errorf("error opening file , err=%v", e)
188199
return
@@ -193,7 +204,7 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
193204
return
194205
}
195206
} else {
196-
partWriter, e := bodyWriter.CreateFormField(field.Fieldname)
207+
partWriter, e := bodyWriter.CreateFormFile(field.Fieldname, field.Filename)
197208
if e != nil {
198209
err = e
199210
return

0 commit comments

Comments
 (0)