post.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package clt_client
  2. import (
  3. "bytes"
  4. "errors"
  5. "io"
  6. "io/ioutil"
  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 ProgramInfo
  17. m.PayloadJSON(&pro)
  18. if pro.Type == "" || pro.Name == "" {
  19. return
  20. }
  21. //准备节目文件和vsn文件
  22. payload, writer, err := prepareFiles(pro)
  23. defer writer.Close()
  24. if err != nil {
  25. return
  26. }
  27. req, _ := http.NewRequest("POST", baseurl+"program/"+pro.Name+".vsn", payload)
  28. req.Header.Add("Content-Type", "multipart/form-data")
  29. req.Header.Set("Content-Type", writer.FormDataContentType())
  30. DoReq:
  31. n := 0
  32. resp, err := c.HttpClient.Do(req)
  33. defer resp.Body.Close()
  34. ioutil.ReadAll(resp.Body)
  35. if err != nil && n < 3 {
  36. n++
  37. time.Sleep(1500 * time.Millisecond)
  38. goto DoReq
  39. }
  40. }
  41. // 准备文件
  42. func prepareFiles(pro ProgramInfo) (*bytes.Buffer, *multipart.Writer, error) {
  43. payload := &bytes.Buffer{}
  44. writer := multipart.NewWriter(payload)
  45. defer writer.Close()
  46. for i, v := range pro.ImageInfo.Urls {
  47. //下载资源文件
  48. resp, err := http.Get(v)
  49. defer resp.Body.Close()
  50. if err != nil {
  51. return nil, nil, err
  52. }
  53. //准备资源文件
  54. part, err := writer.CreateFormFile(pro.Name+strconv.Itoa(i), path.Base(v))
  55. if err != nil {
  56. return nil, nil, err
  57. }
  58. _, err = io.Copy(part, resp.Body)
  59. if err != nil {
  60. return nil, nil, err
  61. }
  62. }
  63. //准备vsn文件
  64. pVsn := NewPVsn(pro)
  65. if pVsn == nil {
  66. return nil, nil, errors.New("发布节目准备文件出错!")
  67. }
  68. part0, _ := writer.CreateFormFile(pro.Name+"-vsn", pro.Name+".vsn")
  69. _, errFile3 := io.Copy(part0, bytes.NewReader(pVsn))
  70. if errFile3 != nil {
  71. return nil, nil, errFile3
  72. }
  73. return payload, writer, nil
  74. }
  75. func (c cltClient) CommonPost(payload []byte, url string) {
  76. var r io.Reader
  77. if payload == nil {
  78. return
  79. } else {
  80. r = bytes.NewReader(payload)
  81. }
  82. req, _ := http.NewRequest("POST", url, r)
  83. c.HttpClient.Do(req)
  84. return
  85. }