file.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package clients
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "io"
  7. "mime/multipart"
  8. "net/http"
  9. "go.uber.org/zap"
  10. )
  11. // PostScreenShotReq 申报截图上传参数
  12. type PostScreenShotReq struct {
  13. Name string // 文件名
  14. TaxNo string // 税号
  15. Period string // 账期
  16. }
  17. // 申报截图上传响应
  18. type PostScreenshotResp struct {
  19. Path string `json:"path"` // 截图路径
  20. }
  21. // FileClient 文件客户端
  22. type FileClient struct {
  23. Client *http.Client // 客户端
  24. Logger *zap.Logger // 日志
  25. }
  26. // PostScreenShotBytes 上传文件 返回上传的 url 参数 bs 为文件内容
  27. func (c FileClient) PostScreenShotBytes(ctx context.Context, bs []byte, p PostScreenShotReq) (string, error) {
  28. return c.PostScreenShot(ctx, bytes.NewReader(bs), p)
  29. }
  30. // PostScreenShot 上传截图 返回上传的 url
  31. func (c FileClient) PostScreenShot(ctx context.Context, r io.Reader, p PostScreenShotReq) (string, error) {
  32. var b bytes.Buffer
  33. mw, err := c.writeMultipart(&b, p, r)
  34. if err != nil {
  35. return "", err
  36. }
  37. const u = "https://file.listensoft.net/api/v1/uploadsbjt"
  38. req, err := http.NewRequestWithContext(ctx, http.MethodPost, u, &b)
  39. if err != nil {
  40. return "", err
  41. }
  42. req.Header.Set("Content-Type", mw.FormDataContentType())
  43. c.Logger.Debug("上传截图", zap.String("url", u), zap.String("name", p.Name))
  44. resp, err := c.Client.Do(req)
  45. if err != nil {
  46. return "", err
  47. }
  48. defer resp.Body.Close()
  49. bs, err := io.ReadAll(resp.Body)
  50. if err != nil {
  51. return "", err
  52. }
  53. var response PostScreenshotResp
  54. err = json.Unmarshal(bs, &response)
  55. if err != nil {
  56. return "", err
  57. }
  58. path := response.Path
  59. c.Logger.Debug("上传截图成功", zap.String("name", p.Name), zap.String("path", path))
  60. return path, nil
  61. }
  62. func (c FileClient) writeMultipart(w io.Writer, param PostScreenShotReq, r io.Reader) (*multipart.Writer, error) {
  63. mw := multipart.NewWriter(w)
  64. err := writeFileFromReader(mw, "file", param.Name, r)
  65. if err != nil {
  66. return nil, err
  67. }
  68. err = mw.WriteField("tax_no", param.TaxNo)
  69. if err != nil {
  70. return nil, err
  71. }
  72. err = mw.WriteField("period", param.Period)
  73. if err != nil {
  74. return nil, err
  75. }
  76. err = mw.WriteField("type", "etax")
  77. if err != nil {
  78. return nil, err
  79. }
  80. err = mw.Close()
  81. if err != nil {
  82. return nil, err
  83. }
  84. return mw, nil
  85. }