云边端架构EasyDSS内Go语言如何生成归档文件?

wx6084d152d85c2 · · 792 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

上一篇我们讲了在EasyDSS定制项目中,把点播文件打包的各种格式,由于用户对产品开发有不同的需求,因此TSINGSEE青犀视频研发团也在探寻更多的定制方式。

微信截图_20201020103742.png

近期我们又接到了新的需求,需要把多个文件归档成一个文件提交给用户下载。将一个文件编辑成一个 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 中。

63.png

64.png

关于EasyDSS的直播点播功能,大家也可以自行下载多多研究和测试,TSINGSEE青犀视频云边端架构全线均提供了试用版本,可以联系我们获取测试账号。更多视频相关解决方案,欢迎咨询了解。


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:wx6084d152d85c2

查看原文:云边端架构EasyDSS内Go语言如何生成归档文件?

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

792 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传