public.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Package clients 提供一些内部接口的 http client 实现
  2. package clients
  3. import (
  4. "bytes"
  5. "context"
  6. "encoding/json"
  7. "io"
  8. "mime/multipart"
  9. "net/http"
  10. "go.uber.org/zap"
  11. )
  12. type PostApiResp[T any] struct {
  13. Data T `json:"data"`
  14. }
  15. type PostFileResp struct {
  16. Url string `json:"url"`
  17. }
  18. // PublicClient 公共文件客户端
  19. type PublicClient struct {
  20. Client *http.Client // 客户端
  21. Logger *zap.Logger // 日志
  22. }
  23. // PostFileBytes 上传文件 返回上传的 url 参数 bs 为文件内容
  24. func (c PublicClient) PostFileBytes(ctx context.Context, name string, bs []byte) (string, error) {
  25. return c.PostFile(ctx, name, bytes.NewReader(bs))
  26. }
  27. // PostFile 上传文件 返回上传的 url
  28. func (c PublicClient) PostFile(ctx context.Context, name string, r io.Reader) (string, error) {
  29. var b bytes.Buffer
  30. mw, err := c.writeMultipart(&b, name, r)
  31. if err != nil {
  32. return "", err
  33. }
  34. const u = "https://public.listensoft.net/api/uploadFile"
  35. req, err := http.NewRequestWithContext(ctx, http.MethodPost, u, &b)
  36. if err != nil {
  37. return "", err
  38. }
  39. req.Header.Set("Content-Type", mw.FormDataContentType())
  40. c.Logger.Debug("上传文件", zap.String("url", u), zap.String("name", name))
  41. resp, err := c.Client.Do(req)
  42. if err != nil {
  43. return "", err
  44. }
  45. defer resp.Body.Close()
  46. bs, err := io.ReadAll(resp.Body)
  47. if err != nil {
  48. return "", err
  49. }
  50. var response PostApiResp[PostFileResp]
  51. err = json.Unmarshal(bs, &response)
  52. if err != nil {
  53. return "", err
  54. }
  55. fu := response.Data.Url
  56. c.Logger.Debug("上传文件成功", zap.String("name", name), zap.String("fileUrl", fu))
  57. return fu, nil
  58. }
  59. func (c PublicClient) writeMultipart(w io.Writer, name string, r io.Reader) (*multipart.Writer, error) {
  60. mw := multipart.NewWriter(w)
  61. err := writeFileFromReader(mw, "upFile", name, r)
  62. if err != nil {
  63. return nil, err
  64. }
  65. err = mw.WriteField("path", "/mnt/bank/banks/")
  66. if err != nil {
  67. return nil, err
  68. }
  69. err = mw.WriteField("name", name)
  70. if err != nil {
  71. return nil, err
  72. }
  73. err = mw.Close()
  74. if err != nil {
  75. return nil, err
  76. }
  77. return mw, nil
  78. }