上一篇我们讲了在EasyDSS定制项目中,把点播文件打包的各种格式,由于用户对产品开发有不同的需求,因此TSINGSEE青犀视频研发团也在探寻更多的定制方式。
近期我们又接到了新的需求,需要把多个文件归档成一个文件提交给用户下载。将一个文件编辑成一个 tar 文件的代码如下:
// tar 单个文件 func tarFile(filesource string, sfileInfo os.FileInfo, tarwriter *tar.Writer) error { sfile, err := os.Open(filesource) if err != nil { fmt.Println(err) return err } defer sfile.Close() header, err := tar.FileInfoHeader(sfileInfo, "") if err != nil { fmt.Println(err) return err } header.Name = sfileInfo.Name() err = tarwriter.WriteHeader(header) if err != nil { fmt.Println(err) return err } if _, err = io.Copy(tarwriter, sfile); err != nil { fmt.Println(err) return err } return nil }
tarFile 函数为将单个文件封装成tar包,主要使用 tar.Writer 进行tar包的封装。调用 tarFile 函数,将多个文件封装成 tar 包的代码如下:
// 将 filePaths 中的所有路径 // targetTarPath 以 tar 为结尾,会自动创建 // filePaths 为文件列表 func TarFiles(targetTarPath string, filePaths *[]string) error { // 创建 tar 文件 tarfile, err := os.Create(targetTarPath) if err != nil { // if file is exist then delete file if err == os.ErrExist { os.Remove(targetTarPath) } return err } defer tarfile.Close() tarWriter := tar.NewWriter(tarfile) // 遍历文件列表,归档 for _, file := range *filePaths { sfileInfo, err := os.Stat(file) if err != nil { return err } // 如果发现不是文件,则直接返回错误 if sfileInfo.IsDir() { os.Remove(targetTarPath) return errors.New("仅支持文件打包。") } err = tarFile(file, sfileInfo, tarWriter) if err != nil { os.Remove(targetTarPath) return err } } return nil }
TarFiles 函数为提供给外部包调用的函数。首先创建对应的 tar 包,然后循环将对应的文件添加到 tar 包中。
对应的测试函数如下:
func TestTarFiles(t *testing.T) { files := make([]string, 0) files = append(files, `D:\testdatas\video\six0413-1.mp4`) files = append(files, `D:\testdatas\video\six0413-2.mp4`) TarFiles(`D:\testdatas\video\test.tar`, &files) }
测试函数的作用为将 six0413-1.mp4 和 six0413-2.mp4 打包到 test.tar 中。
关于EasyDSS的直播点播功能,大家也可以自行下载多多研究和测试,TSINGSEE青犀视频云边端架构全线均提供了试用版本,可以联系我们获取测试账号。更多视频相关解决方案,欢迎咨询了解。
有疑问加站长微信联系(非本文作者)