file_uploader.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright 2021 Tencent Inc. All rights reserved.
  2. package fileuploader
  3. import (
  4. "bytes"
  5. "context"
  6. "crypto/sha256"
  7. "fmt"
  8. "io"
  9. "io/ioutil"
  10. "mime/multipart"
  11. "git.nanodreamtech.com/sg/wechatpay-go/core"
  12. "git.nanodreamtech.com/sg/wechatpay-go/core/consts"
  13. "git.nanodreamtech.com/sg/wechatpay-go/services"
  14. )
  15. // baseFileUploader 基础文件上传
  16. type baseFileUploader services.Service
  17. // upload 将指定文件内容上传到指定地址
  18. //
  19. // 注意:urlpath 不要包含微信支付API服务地址,只包含路径即可,例如 `/v3/merchant/media/upload`
  20. func (s *baseFileUploader) upload(
  21. ctx context.Context, urlpath string, fileReader io.Reader, filename, contentType string,
  22. extra map[string]interface{},
  23. ) (*core.APIResult, error) {
  24. urlpath = consts.WechatPayAPIServer + urlpath
  25. content, err := ioutil.ReadAll(fileReader)
  26. if err != nil {
  27. return nil, err
  28. }
  29. meta := make(map[string]interface{})
  30. meta["filename"] = core.String(filename)
  31. meta["sha256"] = core.String(fmt.Sprintf("%x", sha256.Sum256(content)))
  32. // Override with extra info
  33. for key, value := range extra {
  34. meta[key] = value
  35. }
  36. metaStr, err := core.ParameterToJSON(meta)
  37. if err != nil {
  38. return nil, err
  39. }
  40. body := &bytes.Buffer{}
  41. writer := multipart.NewWriter(body)
  42. if err = core.CreateFormField(writer, "meta", "application/json", []byte(metaStr)); err != nil {
  43. return nil, err
  44. }
  45. if err = core.CreateFormFile(writer, filename, contentType, content); err != nil {
  46. return nil, err
  47. }
  48. if err = writer.Close(); err != nil {
  49. return nil, err
  50. }
  51. result, err := s.Client.Upload(ctx, urlpath, metaStr, body.String(), writer.FormDataContentType())
  52. return result, err
  53. }