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

    今年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:	estdatasvideosix0413-1.mp4`)
       files = append(files, `F:	estdatasvideosix0413-2.mp4`)
       // files = append(files, `F:	estdatasvideoWe married as a job EP07.mp4`)
       // files = append(files, `F:	estdatasvideo都市侠盗.Leverage.S01E01.Chi_Eng.HR-HDTV.AC3.1024X576.x264-YYeTs人人影视V2.mkv`)
       ZipFiles(`F:	estdatasvideo	est.zip`, &files)
       fmt.Println("花费时间:", time.Since(start))
    }
    
    

    测试函数的作用为将 six0413-1.mp4 和 six0413-2.mp4 打包到 test.zip 中。

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

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

  • 相关阅读:
    POJ 2502 Subway(最短路径)
    HDU 1430 魔板
    HDU 1043 POJ 1077 八数码问题
    POJ 2576 Tug of War 随机算法(非正规解法)
    什么是COM
    6.0的版本的 tc,不支持大漠对象做数组吗?
    Q键连发。按住Q键则连发。松开则停止1。
    Q键连发。按住Q键 则连发。松开则停止2。
    特殊符号。
    僵尸_另类的生命体。
  • 原文地址:https://www.cnblogs.com/easydss/p/14156120.html
Copyright © 2011-2022 走看看