今年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由于其直播點播的功能,非常適用于遠程教育、遠程醫療的情況,如果大家有需求,歡迎聯系我們了解或測驗,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237152.html
標籤:其他
上一篇:華為 AppGallery Connect 構建游戲分發能力,賦能游戲全生命周期
下一篇:鄰接矩陣:BFS實作拓撲排序(實作輸入兩種格式的圖的輸入函式)(為什么總是出現RE)(一道題試怎么讓一個程式員枯萎的,又是怎么起死回生的)
