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