12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Copyright 2021 Tencent Inc. All rights reserved.
- package fileuploader
- import (
- "bytes"
- "context"
- "crypto/sha256"
- "fmt"
- "io"
- "io/ioutil"
- "mime/multipart"
- "git.nanodreamtech.com/sg/wechatpay-go/core"
- "git.nanodreamtech.com/sg/wechatpay-go/core/consts"
- "git.nanodreamtech.com/sg/wechatpay-go/services"
- )
- // baseFileUploader 基础文件上传
- type baseFileUploader services.Service
- // upload 将指定文件内容上传到指定地址
- //
- // 注意:urlpath 不要包含微信支付API服务地址,只包含路径即可,例如 `/v3/merchant/media/upload`
- func (s *baseFileUploader) upload(
- ctx context.Context, urlpath string, fileReader io.Reader, filename, contentType string,
- extra map[string]interface{},
- ) (*core.APIResult, error) {
- urlpath = consts.WechatPayAPIServer + urlpath
- content, err := ioutil.ReadAll(fileReader)
- if err != nil {
- return nil, err
- }
- meta := make(map[string]interface{})
- meta["filename"] = core.String(filename)
- meta["sha256"] = core.String(fmt.Sprintf("%x", sha256.Sum256(content)))
- // Override with extra info
- for key, value := range extra {
- meta[key] = value
- }
- metaStr, err := core.ParameterToJSON(meta)
- if err != nil {
- return nil, err
- }
- body := &bytes.Buffer{}
- writer := multipart.NewWriter(body)
- if err = core.CreateFormField(writer, "meta", "application/json", []byte(metaStr)); err != nil {
- return nil, err
- }
- if err = core.CreateFormFile(writer, filename, contentType, content); err != nil {
- return nil, err
- }
- if err = writer.Close(); err != nil {
- return nil, err
- }
- result, err := s.Client.Upload(ctx, urlpath, metaStr, body.String(), writer.FormDataContentType())
- return result, err
- }
|