菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
278
0

【开发记录】RTMP协议互联网直播点播视频平台EasyDSS批量下载开发Go语言生成zip文件功能

原创
05/13 14:22
阅读数 68288

今年TSINGSEE青犀视频研发团队对EasyDSS做了比较大的改版,在很多功能上都做了优化,目前EasyDSS上的大部分工作都已经完成,因此我们把中心放在了EasyCVR视频融合平台的开发和webrtc的开发上。但其实EasyDSS的用户量还是很庞大的,常常有客户会提出一些比较细节的问题,当然我们也会积极配合优化。

在某位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 中。

经过测试,两个50M的文件大概花费时间6s,极大节省了下载时间,提升了运维效率。

在EasyDSS中,我们很多地方都是采用go语言来做的定制功能,比如通过Go 语言生成 CSV 文件,以满足客户要求实现归档清单的功能。EasyDSS由于其直播点播的功能,非常适用于远程教育、远程医疗的情况,如果大家有需求,欢迎联系我们了解或测试。

发表评论

0/200
278 点赞
0 评论
收藏