• RTMP协议Web直播点播视频平台EasyDSS采用Go语言对象存储解冻文件功能的实现


    我们介绍过很多关于EasyDSS的定制项目,其中大部分都是通过Go语言完成的,例如通过Go语言 gorm 框架钩子函数精简代码,或者通过Go语言生成归档文件功能,现下基于部分用户的使用需求,我们还需要做出小幅调整,目前的调整是需要将录像存储在云的OSS中。

    OSS为对象存储服务,即云中心提供的一种云上存储。部分用户不便于自建服务器存储,就会选择OSS来进行云存储。一般对象存储分配为标准存储、低频存储和归档存储三种类型。其中标准存储和低频存储,可以直接生成 url 地址提供给用户访问,但是价格相比于归档存储高,对于部分不常使用的数据,可以选择归档存储降低价格。

    归档存储的存储类型是一种不可以直接生成 url 地址就能访问的类型,在访问直接必须先对文件进行解冻操作,以下就以阿里云程序进行解冻代码的编写,其他腾讯云、移动云、华为云等程序类似,代码如下:

    // 解冻文件
    func RestoreObject(bucketName, file string) (string, error) {
       ret := "解冻命令未发送"
       // 获取存储空间。
       bucket, err := gOssClient.Bucket(bucketName)
       if err != nil {
          return ret, err
       }
    
       // 检查是否为归档类型文件。
       meta, err := bucket.GetObjectDetailedMeta(file)
       if err != nil {
          return ret, err
       }
    
       storage := meta.Get("x-oss-storage-class")
    
       // 如果是标准存储或者是低频存储,直接返回
       if storage != string(oss.StorageArchive) && storage != string(oss.StorageColdArchive) {
          return ret, errors.New("该文件存储类型不需要解冻")
       }
    
       status := meta.Get("X-Oss-Restore")
       if status != "" {
          ret = "不处于未解冻状态,无需解冻!"
          return ret, nil
       }
    
       // 如果是归档文件,调用解冻归档文件
       if storage == string(oss.StorageArchive) {
          err = bucket.RestoreObject(file)
          if err != nil {
             return ret, err
          } else {
             ret = "解冻命令已成功发送到后台!"
          }
       } else if storage == string(oss.StorageArchive) {
          var restoreConfig oss.RestoreConfiguration
    
          // 表示1小时内完成解冻。
          restoreConfig.Tier = string(oss.RestoreExpedited)
          // 表示2~5小时内完成解冻。
          //restoreConfig.Tier = string(oss.RestoreStandard)
          // 表示5~12小时内完成解冻。
          //restoreConfig.Tier = string(oss.RestoreBulk)
          // 解冻状态保持1天。
          restoreConfig.Days = 1
          err = bucket.RestoreObjectDetail(file, restoreConfig)
          if err != nil {
             return ret, err
          } else {
             ret = "解冻命令已成功发送到后台!"
          }
       }
    
       return ret, nil
    }
    
    

    其中 RestoreObject 就是解冻文件操作,也可以采用 RestoreObjectDetail 解冻文件。在解冻文件之前最好调用 meta.Get(“x-oss-strage-calss”) 获取文件的状态,如果是标准存储或者低频存储则不进行解冻操作。

  • 相关阅读:
    ansible源码解读
    python标准模块(下)
    python学习之算法、自定义模块、系统标准模块(上)
    pathon 基础学习-集合(set),单双队列,深浅copy,内置函数
    python的map,filter,reduce学习
    python 列表
    python生成器、装饰器、正则
    python 模块学习
    python基础学习(一)--数据类型
    时间复杂度的计算
  • 原文地址:https://www.cnblogs.com/easydss/p/14583071.html
Copyright © 2020-2023  润新知