我们介绍过很多关于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”) 获取文件的状态,如果是标准存储或者低频存储则不进行解冻操作。

posted on 2021-03-26 16:51  EasyDSS  阅读(63)  评论(0编辑  收藏  举报