post.go 2.5 KB

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