Skip to content

Commit 6b3532c

Browse files
authored
feat: Material 增加 AddMaterialFromReader 与 AddVideoFromReader 方法 (#780)
* feat: Material 增加 AddMaterialFromReader 与 AddVideoFromReader 方法 * update: 调整 PostFileFromReader 参数。
1 parent 1138a7d commit 6b3532c

File tree

2 files changed

+67
-22
lines changed

2 files changed

+67
-22
lines changed

officialaccount/material/material.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"encoding/json"
55
"errors"
66
"fmt"
7+
"io"
8+
"os"
79

810
"github.com/silenceper/wechat/v2/officialaccount/context"
911
"github.com/silenceper/wechat/v2/util"
@@ -160,8 +162,8 @@ type resAddMaterial struct {
160162
URL string `json:"url"`
161163
}
162164

163-
// AddMaterial 上传永久性素材(处理视频需要单独上传)
164-
func (material *Material) AddMaterial(mediaType MediaType, filename string) (mediaID string, url string, err error) {
165+
// AddMaterialFromReader 上传永久性素材(处理视频需要单独上传),从 io.Reader 中读取
166+
func (material *Material) AddMaterialFromReader(mediaType MediaType, filename string, reader io.Reader) (mediaID string, url string, err error) {
165167
if mediaType == MediaTypeVideo {
166168
err = errors.New("永久视频素材上传使用 AddVideo 方法")
167169
return
@@ -174,7 +176,7 @@ func (material *Material) AddMaterial(mediaType MediaType, filename string) (med
174176

175177
uri := fmt.Sprintf("%s?access_token=%s&type=%s", addMaterialURL, accessToken, mediaType)
176178
var response []byte
177-
response, err = util.PostFile("media", filename, uri)
179+
response, err = util.PostFileFromReader("media", filename, uri, reader)
178180
if err != nil {
179181
return
180182
}
@@ -192,13 +194,24 @@ func (material *Material) AddMaterial(mediaType MediaType, filename string) (med
192194
return
193195
}
194196

197+
// AddMaterial 上传永久性素材(处理视频需要单独上传)
198+
func (material *Material) AddMaterial(mediaType MediaType, filename string) (mediaID string, url string, err error) {
199+
f, err := os.Open(filename)
200+
if err != nil {
201+
return
202+
}
203+
defer func() { _ = f.Close() }()
204+
205+
return material.AddMaterialFromReader(mediaType, filename, f)
206+
}
207+
195208
type reqVideo struct {
196209
Title string `json:"title"`
197210
Introduction string `json:"introduction"`
198211
}
199212

200-
// AddVideo 永久视频素材文件上传
201-
func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) {
213+
// AddVideoFromReader 永久视频素材文件上传,从 io.Reader 中读取
214+
func (material *Material) AddVideoFromReader(filename, title, introduction string, reader io.Reader) (mediaID string, url string, err error) {
202215
var accessToken string
203216
accessToken, err = material.GetAccessToken()
204217
if err != nil {
@@ -219,9 +232,10 @@ func (material *Material) AddVideo(filename, title, introduction string) (mediaI
219232

220233
fields := []util.MultipartFormField{
221234
{
222-
IsFile: true,
223-
Fieldname: "media",
224-
Filename: filename,
235+
IsFile: true,
236+
Fieldname: "media",
237+
Filename: filename,
238+
FileReader: reader,
225239
},
226240
{
227241
IsFile: false,
@@ -250,6 +264,17 @@ func (material *Material) AddVideo(filename, title, introduction string) (mediaI
250264
return
251265
}
252266

267+
// AddVideo 永久视频素材文件上传
268+
func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) {
269+
f, err := os.Open(filename)
270+
if err != nil {
271+
return "", "", err
272+
}
273+
defer func() { _ = f.Close() }()
274+
275+
return material.AddVideoFromReader(filename, title, introduction, f)
276+
}
277+
253278
type reqDeleteMaterial struct {
254279
MediaID string `json:"media_id"`
255280
}

util/http.go

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,26 @@ func PostFile(fieldName, filename, uri string) ([]byte, error) {
158158
return PostMultipartForm(fields, uri)
159159
}
160160

161+
// PostFileFromReader 上传文件,从 io.Reader 中读取
162+
func PostFileFromReader(filedName, fileName, uri string, reader io.Reader) ([]byte, error) {
163+
fields := []MultipartFormField{
164+
{
165+
IsFile: true,
166+
Fieldname: filedName,
167+
Filename: fileName,
168+
FileReader: reader,
169+
},
170+
}
171+
return PostMultipartForm(fields, uri)
172+
}
173+
161174
// MultipartFormField 保存文件或其他字段信息
162175
type MultipartFormField struct {
163-
IsFile bool
164-
Fieldname string
165-
Value []byte
166-
Filename string
176+
IsFile bool
177+
Fieldname string
178+
Value []byte
179+
Filename string
180+
FileReader io.Reader
167181
}
168182

169183
// PostMultipartForm 上传文件或其他多个字段
@@ -182,15 +196,21 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
182196
return
183197
}
184198

185-
fh, e := os.Open(field.Filename)
186-
if e != nil {
187-
err = fmt.Errorf("error opening file , err=%v", e)
188-
return
189-
}
190-
defer fh.Close()
191-
192-
if _, err = io.Copy(fileWriter, fh); err != nil {
193-
return
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+
}
194214
}
195215
} else {
196216
partWriter, e := bodyWriter.CreateFormField(field.Fieldname)
@@ -215,7 +235,7 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
215235
}
216236
defer resp.Body.Close()
217237
if resp.StatusCode != http.StatusOK {
218-
return nil, err
238+
return nil, fmt.Errorf("http code error : uri=%v , statusCode=%v", uri, resp.StatusCode)
219239
}
220240
respBody, err = io.ReadAll(resp.Body)
221241
return

0 commit comments

Comments
 (0)