RTMP協議互聯網直播點播視頻平臺EasyDSS批量下載開發Go語言生成zip文件功能

今年TSINGSEE青犀視頻研發團隊對EasyDSS做了比較大的改版,在很多功能上都做了優化,目前EasyDSS上的大部分工作都已經完成,因此我們把中心放在了EasyCVR視頻融合平臺的開發和webrtc的開發上。但其實EasyDSS的用戶量還是很龐大的,常常有客戶會提出一些比較細節的問題,當然我們也會積極配合優化。

微信截圖_20201020103926.png

在EasyDSS客戶的部分定製項目中,由於客戶需要大量下載文件,而單個下載的效率又很慢,因此提出需要批量下載功能,也就是將多個文件生成一個 zip 文件下載。因此我們採用Go語言了生成zip文件的方式實現批量下載,參考代碼如下:

// 壓縮文件
func ZipFiles(zipPath string, fileList *[]string) error {
   if len(*fileList) < 1 {
      return fmt.Errorf("將要壓縮的文件列表不能爲空")
   }
   fz, err := os.Create(zipPath)
   if err != nil {
      return err
   }
   defer fz.Close()
   zw := zip.NewWriter(fz)
   defer zw.Close()

   for _, fileName := range *fileList {
      fr, err := os.Open(fileName)
      if err != nil {
         return err
      }

      stat, _ := fr.Stat()
      if stat.IsDir() {
         return errors.New("僅支持文件打包。")
      }

      // 寫入文件的頭信息
      var w io.Writer
      w, err = zw.Create(filepath.Base(fileName))

      if err != nil {
         return err
      }

      // 寫入文件內容
      _, err = io.Copy(w, fr)
      if err != nil {
         return err
      }
   }
   return zw.Flush()
}

其中 defer fz.Close() 和 defer zw.Close() 一定不能省略。省略zw.Close() 會導致最後一個文件不能寫入到zip包中,導致zip打包失敗。fz.Close() 導致文件一直被程序佔用。

對應的測試函數如下:

func TestZipFiles(t *testing.T) {
   start := time.Now()
   files := make([]string, 0)
   files = append(files, `F:\testdatas\video\six0413-1.mp4`)
   files = append(files, `F:\testdatas\video\six0413-2.mp4`)
   // files = append(files, `F:\testdatas\video\We married as a job EP07.mp4`)
   // files = append(files, `F:\testdatas\video\都市俠盜.Leverage.S01E01.Chi_Eng.HR-HDTV.AC3.1024X576.x264-YYeTs人人影視V2.mkv`)
   ZipFiles(`F:\testdatas\video\test.zip`, &files)
   fmt.Println("花費時間:", time.Since(start))
}

測試函數的作用爲將 six0413-1.mp4 和 six0413-2.mp4 打包到 test.zip 中。

54.png

經過測試,兩個50M的文件大概花費時間6s,極大節省了下載時間,提升了運維效率。

DSS14.png

在EasyDSS中,我們很多地方都是採用go語言來做的定製功能,比如通過Go 語言生成 CSV 文件,以滿足客戶要求實現歸檔清單的功能。EasyDSS由於其直播點播的功能,非常適用於遠程教育、遠程醫療的情況,如果大家有需求,歡迎聯繫我們瞭解或測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章