package clt_client import ( "bytes" "errors" "github.com/sirupsen/logrus" "io" "io/ioutil" "lc/common/mqtt" "mime/multipart" "net/http" "path" "strconv" "time" ) // PublishProgram 发布节目 func (c cltclient) PublishProgram(m mqtt.Message, baseurl string) { var pro Programm m.PayloadJSON(&pro) if pro.Type == "" || pro.Name == "" { logrus.Errorf("mqtt message格式错误,topic:%v", m.Topic()) logrus.Errorf("PayloadString:%v", m.PayloadString()) return } //准备节目文件和vsn文件 payload, writer, err := prepareFiles(pro) defer writer.Close() if err != nil { logrus.Errorf("error: %v, 消息内容: %+v", err, pro) return } req, _ := http.NewRequest("POST", baseurl+"program/"+pro.Name+".vsn", payload) req.Header.Add("Content-Type", "multipart/form-data") req.Header.Set("Content-Type", writer.FormDataContentType()) DoReq: n := 0 resp, err := c.HttpClient.Do(req) defer resp.Body.Close() ioutil.ReadAll(resp.Body) if err != nil && n < 3 { logrus.Errorf("节目发布http错误:%v, 消息内容: %+v", err, pro) n++ time.Sleep(1500 * time.Millisecond) goto DoReq } } // 准备文件 func prepareFiles(pro Programm) (*bytes.Buffer, *multipart.Writer, error) { payload := &bytes.Buffer{} writer := multipart.NewWriter(payload) defer writer.Close() for i, v := range pro.ImageInfo.Urls { //下载资源文件 resp, err := http.Get(v) defer resp.Body.Close() if err != nil { return nil, nil, err } //准备资源文件 part, err := writer.CreateFormFile(pro.Name+strconv.Itoa(i), path.Base(v)) if err != nil { return nil, nil, err } // _, err = io.Copy(part, resp.Body) if err != nil { return nil, nil, err } } //准备vsn文件 vsnfile := NewPVsn(pro) if vsnfile == nil { return nil, nil, errors.New("发布节目准备文件出错!") } part0, _ := writer.CreateFormFile(pro.Name+"-vsn", pro.Name+".vsn") _, errFile3 := io.Copy(part0, bytes.NewReader(vsnfile)) if errFile3 != nil { logrus.Errorf("打开vsn文件错误:%s", errFile3) return nil, nil, errFile3 } return payload, writer, nil } func (c cltclient) CommonPost(payload []byte, url string) error { var r io.Reader if payload == nil { return errors.New("func CommonPost error POST操作消息体不能为空!") } else { r = bytes.NewReader(payload) } req, err := http.NewRequest("POST", url, r) resp, err := c.HttpClient.Do(req) if err != nil { return err } defer resp.Body.Close() ioutil.ReadAll(resp.Body) return nil }