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由于其直播点播的功能,非常适用于远程教育、远程医疗的情况,如果大家有需求,欢迎联系我们了解或测试。

  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/easydss/p/14156120.html
Copyright © 2011-2022 走看看