post.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package clt_client
  2. import (
  3. "bytes"
  4. "errors"
  5. "github.com/sirupsen/logrus"
  6. "io"
  7. "lc/common/mqtt"
  8. "mime/multipart"
  9. "net/http"
  10. "path"
  11. "strconv"
  12. "time"
  13. )
  14. // PublishProgram 发布节目
  15. func (c cltclient) PublishProgram(m mqtt.Message, baseurl string) {
  16. var pro Programm
  17. m.PayloadJSON(&pro)
  18. if pro.Type == "" || pro.Name == "" {
  19. logrus.Errorf("mqtt message格式错误,topic:%v", m.Topic())
  20. logrus.Errorf("PayloadString:%v", m.PayloadString())
  21. return
  22. }
  23. //准备节目文件和vsn文件
  24. payload, writer, err := prepareFiles(pro)
  25. defer writer.Close()
  26. if err != nil {
  27. logrus.Errorf("error: %v, 消息内容: %+v", err, pro)
  28. return
  29. }
  30. req, _ := http.NewRequest("POST", baseurl+"program/"+pro.Name+".vsn", payload)
  31. req.Header.Add("Content-Type", "multipart/form-data")
  32. req.Header.Set("Content-Type", writer.FormDataContentType())
  33. DoReq:
  34. n := 0
  35. resp, err := c.HttpClient.Do(req)
  36. defer resp.Body.Close()
  37. io.ReadAll(resp.Body)
  38. if err != nil && n < 3 {
  39. logrus.Errorf("节目发布http错误:%v, 消息内容: %+v", err, pro)
  40. n++
  41. time.Sleep(1500 * time.Millisecond)
  42. goto DoReq
  43. }
  44. }
  45. // 准备文件
  46. func prepareFiles(pro Programm) (*bytes.Buffer, *multipart.Writer, error) {
  47. payload := &bytes.Buffer{}
  48. writer := multipart.NewWriter(payload)
  49. defer writer.Close()
  50. for i, v := range pro.ImageInfo.Urls {
  51. //下载资源文件
  52. resp, err := http.Get(v)
  53. defer resp.Body.Close()
  54. if err != nil {
  55. return nil, nil, err
  56. }
  57. //准备资源文件
  58. part, err := writer.CreateFormFile(pro.Name+strconv.Itoa(i), path.Base(v))
  59. if err != nil {
  60. return nil, nil, err
  61. }
  62. //
  63. _, err = io.Copy(part, resp.Body)
  64. if err != nil {
  65. return nil, nil, err
  66. }
  67. }
  68. //准备vsn文件
  69. vsnfile := NewPVsn(pro)
  70. if vsnfile == nil {
  71. return nil, nil, errors.New("发布节目准备文件出错!")
  72. }
  73. part0, _ := writer.CreateFormFile(pro.Name+"-vsn", pro.Name+".vsn")
  74. _, errFile3 := io.Copy(part0, bytes.NewReader(vsnfile))
  75. if errFile3 != nil {
  76. logrus.Errorf("打开vsn文件错误:%s", errFile3)
  77. return nil, nil, errFile3
  78. }
  79. return payload, writer, nil
  80. }
  81. func (c cltclient) CommonPost(payload []byte, url string) error {
  82. var r io.Reader
  83. if payload == nil {
  84. return errors.New("func CommonPost error POST操作消息体不能为空!")
  85. } else {
  86. r = bytes.NewReader(payload)
  87. }
  88. req, err := http.NewRequest("POST", url, r)
  89. resp, err := c.HttpClient.Do(req)
  90. if err != nil {
  91. return err
  92. }
  93. defer resp.Body.Close()
  94. io.ReadAll(resp.Body)
  95. return nil
  96. }