更新时间:2026-08-28 GMT+08:00
分享

下载归档存储对象

如果要下载归档存储对象,需要先将归档存储对象恢复。恢复选项分为以下两类,见下表:

选项

说明

枚举值

快速恢复

恢复耗时1~5分钟。

OBSRestoreTierExpedited

标准恢复

恢复耗时3~5小时。默认值。

OBSRestoreTierStandard

重复恢复归档或深度归档存储数据时,系统将延长恢复有效期。同时,将对恢复操作产生的费用进行重复收取。

您可以通过OBSRestoreObjectRequest恢复归档存储对象。以下代码展示了如何下载归档存储对象:

#pragma mark - Entry Point
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        static OBSClient *client;
        NSString *endPoint = @"https://your-endpoint";
        // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
        // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
        char* ak_env = getenv("AccessKeyID");
        char* sk_env = getenv("SecretAccessKey");
        if (ak_env == NULL || sk_env == NULL) {
            NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
            return 1;
        }
        NSString *AK = [NSString stringWithUTF8String:ak_env];
        NSString *SK = [NSString stringWithUTF8String:sk_env];
        
        // 初始化身份验证
        OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
        
        //初始化服务配置
        OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
        
        // 初始化client
        client = [[OBSClient alloc] initWithConfiguration:conf];
        
        // 恢复对象
        OBSRestoreObjectRequest *request = [[OBSRestoreObjectRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" storeDays:[NSNumber numberWithInt:30]]; // storeDays: 恢复副本的有效期,取值范围1-30天
        request.restoreTier = OBSRestoreTierExpedited; // restoreTier: 恢复选项,不设置时服务端默认Standard
        
        [client restoreObject:request completionHandler:^(OBSRestoreObjectResponse *response, NSError *error){
            NSLog(@"%@",response);
        }];
        
        // task可用于等待恢复完成
        
        // 等待对象恢复
        sleep(6*60);
        
        // 下载对象
        NSString * outfilePath = [NSTemporaryDirectory() stringByAppendingString:@"filename"];
        OBSGetObjectToFileRequest *request1 = [[OBSGetObjectToFileRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" downloadFilePath:outfilePath];
        request1.downloadProgressBlock = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
            NSLog(@"%0.1f%%",(float)floor((totalBytesExpectedToWrite > 0) ? (totalBytesWritten*10000/totalBytesExpectedToWrite) : 0)/100);
        };
        
        [client getObject:request1 completionHandler:^(OBSGetObjectResponse *response, NSError *error){
            if(response.etag){NSLog(@"%@",response.etag);}
        }];
    }
    return 0;
}
    

相关文档