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