全部產品
Search
文件中心

Object Storage Service:解凍歸檔、冷歸檔、深度冷歸檔的OSS檔案以便讀取

更新時間:May 15, 2025

如果未開啟歸檔直讀,歸檔類型的Object需要解凍後才能讀取。冷歸檔、深度冷歸檔不支援開啟直讀,冷歸檔、深度冷歸檔類型的Object需要解凍後才能讀取。涉及讀取的操作包括下載(GetObject)、圖片處理(ProcessImage)、拷貝(CopyObject)、分區拷貝(UploadPartCopy)、查詢(SelectObject)以及通過POST請求進行資料處理(PostProcessTask)。本文介紹執行資料讀取操作之前,如何完成歸檔、冷歸檔以及深度冷歸檔Object的解凍操作。

前提條件

注意事項

  • RestoreObject介面只針對歸檔、冷歸檔和深度冷歸檔類型的Object,不適用於標準類型和低頻訪問類型的Object。

  • 對歸檔、冷歸檔以及深度冷歸檔Object執行非資料讀取請求時(例如DeleteObjectDeleteMultipleObjectsGetObjectMetaHeadObject等),無需解凍就能操作。對於無需解凍就能完成的操作,如果再解凍,將會產生額外不必要的費用。

  • 對於Object第一次調用RestoreObject介面,則返回202。如果已經成功調用過RestoreObject介面,且Object已完成解凍,再次調用時返回200 OK。

  • 對於正在解凍中的Object,再次調用 RestoreObject 介面僅允許提升解凍優先順序,否則報錯409。

  • 對於開啟版本控制的Bucket,Object的各個版本可以對應不同的儲存類型。調用RestoreObject介面預設解凍Object目前的版本,您可以通過指定versionId的方式來解凍Object指定版本。

解凍過程

不同儲存類型的Object的解凍過程相同。Object的解凍過程如下。

  1. 初始時,Object處於冷凍狀態。

  2. 提交一次解凍請求後,Object處於解凍中狀態。

  3. 服務端完成解凍任務後,Object進入解凍狀態。此時您可以讀取Object。

  4. 如果Object處於解凍狀態時,再次提交一次解凍請求,Object的解凍狀態期間在原基礎上累加。延長後的總時間長度不能超過每種儲存類型的解凍狀態期間的最大值。

  5. 解凍狀態結束後,Object再次返回到冷凍狀態,且不改變Object原有的儲存類型。

解凍消耗時間

解凍不同儲存類型的Object所消耗的時間可參考下表。解凍時間請以實際為準。

Object的儲存類型

說明

歸檔類型

1分鐘。

冷歸檔類型

  • 高優先順序(Expedited):表示1小時內完成解凍。

  • 標準(Standard):表示2~5小時內完成解凍。

  • 批量(Bulk):表示5~12小時內完成解凍。

深度冷歸檔類型

  • 高優先順序(Expedited):表示12小時內完成解凍。

  • 標準(Standard):表示48小時內完成解凍。

解凍配額

  • 單個阿里雲帳號在單個地區的冷歸檔類型的Object的解凍配額參考值:平均每秒500個Object,三種解凍優先順序總解凍配額為每天100 TB~120 TB。如您的業務有更高的解凍配額需求,請聯絡支援人員

  • 單個阿里雲帳號在單個地區的深度冷歸檔類型的Object解凍配額參考值:平均每秒100個Object,兩種解凍優先順序總解凍配額為每天10 TB~15 TB。如您的業務有更高的解凍配額需求,請聯絡支援人員

說明

超出冷歸檔以及深度冷歸檔的解凍配額參考值後,仍可以提交解凍請求。解凍請求將排入隊列中,且解凍完成時間可能超出指定優先順序對應的完成時間。

解凍狀態期間

不同儲存類型的Object處於解凍狀態的期間如下。

Object的儲存類型

說明

歸檔類型

取值為1~7的正整數,單位為天。

冷歸檔類型

取值為1~365的正整數,單位為天。

深度冷歸檔類型

取值為1~365的正整數,單位為天。

計費說明

  • 解凍歸檔、冷歸檔、深度冷歸檔類型的Object會產生資料取回容量費用。更多資訊,請參見資料處理費用

  • 解凍歸檔類型的Object會產生Put類型請求次數費用。更多資訊,請參見請求費用

  • 解凍冷歸檔、深度冷歸檔類型的Object會產生取回請求次數費用。更多資訊,請參見請求費用

  • 歸檔類型、冷歸檔、深度冷歸檔類型的Object在解凍過程中以及解凍完成後,均按照相應的儲存類型計算儲存費用。更多資訊,請參見儲存費用

  • 冷歸檔、深度冷歸檔類型的Object在解凍時,會產生一份標準儲存類型的檔案副本用於訪問,該檔案在解凍時間結束前會以標準儲存的儲存費率計算臨時儲存費用。更多資訊,請參見臨時儲存費用

  • 歸檔類型的Object可達到最長7天的解凍期間,冷歸檔、深度冷歸檔類型的Object可達到最長365天的解凍期間,在此期間不再重複收取資料取回費用。

  • 解凍狀態結束後,Object又回到冷凍狀態,再次執行解凍操作會收取資料取回費用。

操作方式

使用OSS控制台

說明

OSS控制台不支援批量解凍某個目錄下的檔案。如果您需要批量解凍某個目錄下的檔案,您可以使用命令列工具ossutil、阿里雲SDK、REST API。

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇文件管理>檔案清單

  4. 在目標檔案右側的操作欄下,選擇more > 解凍

    • Archive Storage類型Object

      • 解凍需要約1分鐘時間,解凍成功後,Object變為解凍狀態。

      • 解凍狀態預設持續1天。您可以通過命令列工具ossutil、阿里雲SDK、REST API延長解凍時間,最多延長7天。超過解凍狀態期間後,檔案又回到冷凍狀態。

    • 冷歸檔或者深度冷歸檔類型Object

      • 副本有效期間:用於設定Object處於解凍狀態的期間。單位為天。 預設為1天。最大為365天。超過解凍狀態期間後,檔案又回到冷凍狀態。

      • 復原模式:用於設定解凍優先順序。根據解凍檔案的大小,實際解凍時間可能會有變化,請以實際解凍時間為準。

使用阿里雲SDK

以下僅列舉常見SDK的解凍檔案的程式碼範例。關於其他SDK的解凍檔案的程式碼範例,請參見SDK簡介

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫不包含Bucket名稱在內的歸檔類型Object的完整路徑。
        String objectName = "exampledir/object";
        // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
        String region = "cn-hangzhou";

        // 建立OSSClient執行個體。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);

            // 校正Object是否為歸檔類型Object。
            StorageClass storageClass = objectMetadata.getObjectStorageClass();
            if (storageClass == StorageClass.Archive) {
                // 解凍Object。
                ossClient.restoreObject(bucketName, objectName);

                // 等待解凍完成。
                do {
                    Thread.sleep(1000);
                    objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
                } while (!objectMetadata.isRestoreCompleted());
            }

            // 擷取解凍Object。
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
            ossObject.getObjectContent().close();
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}           
import time
import argparse
import alibabacloud_oss_v2 as oss

# 建立一個命令列參數解析器
parser = argparse.ArgumentParser(description="restore object sample")
# 添加需要的命令列參數
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)

def main():
    # 解析傳入的命令列參數
    args = parser.parse_args()

    # 從環境變數載入認證資訊
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # 使用SDK預設配置
    cfg = oss.config.load_default()
    # 設定認證提供者為環境變數認證
    cfg.credentials_provider = credentials_provider
    # 設定地區
    cfg.region = args.region
    # 如果提供了endpoint,則設定endpoint為配置項
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 建立OSS用戶端
    client = oss.Client(cfg)

    # 執行解凍對象請求
    result = client.restore_object(oss.RestoreObjectRequest(
        bucket=args.bucket,
        key=args.key,
        restore_request=oss.RestoreRequest(
            days=1,
            # 可選:設定冷歸檔、深度冷歸檔對象的解凍優先順序,可設定為:Expedited、Standard、Bulk,預設值為Standard
            # tier="Bulk",
        )
    ))

    # 列印解凍請求的結果
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' version id: {result.version_id},'
          f' restore priority: {result.restore_priority},'
    )

    # 迴圈檢查對象是否已經完成解凍
    while True:
        # 擷取對象頭部資訊
        result = client.head_object(oss.HeadObjectRequest(
            bucket=args.bucket,
            key=args.key,
        ))

        # 檢查解凍狀態
        if result.restore and result.restore != 'ongoing-request="true"':
            print('restore is success')
            break
        # 5秒後再次檢查
        time.sleep(5)
        print(result.restore)

# 程式入口
if __name__ == "__main__":
    main()
const OSS = require('ali-oss')

const client = new OSS({
  //yourRegion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
  region: 'yourRegion',
  // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  //填寫Bucket名稱,例如examplebucket。
  bucket: 'examplebucket',
});

//填寫待解凍的歸檔類型Object名稱,例如exampleobject.txt。
client.restore('exampleobject.txt').then((res) => {
    console.log(res);
}).catch(err => {
    console.log(err);
})
using Aliyun.OSS;
using Aliyun.OSS.Model;
using Aliyun.OSS.Model;
using System.Net;
using System.Text;
using Aliyun.OSS.Common;

// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱。
var bucketName = "examplebucket";
// 填寫不包含Bucket名稱在內的歸檔類型Object的完整路徑。
var objectName = "yourObjectName";
// 自訂Object內容。
var objectContent = "More than just cloud.";
int maxWaitTimeInSeconds = 600;
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";

// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();

// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;

// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // 建立Archive Storage空間。
    var bucket = client.CreateBucket(bucketName, StorageClass.Archive);
    Console.WriteLine("Create Archive bucket succeeded, {0} ", bucket.Name);
}
catch (Exception ex)
{
    Console.WriteLine("Create Archive bucket failed, {0}", ex.Message);
}
// 上傳檔案並設定儲存類型為歸檔類型。
try
{
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    client.PutObject(bucketName, objectName, requestContent);
    Console.WriteLine("Put object succeeded, {0}", objectName);
}
catch (Exception ex)
{
    Console.WriteLine("Put object failed, {0}", ex.Message);
}
var metadata = client.GetObjectMetadata(bucketName, objectName);
string storageClass = metadata.HttpMetadata["x-oss-storage-class"] as string;
if (storageClass != "Archive")
{
    Console.WriteLine("StorageClass is {0}", storageClass);
    return;
}
// 解凍歸檔Object。
RestoreObjectResult result = client.RestoreObject(bucketName, objectName);
Console.WriteLine("RestoreObject result HttpStatusCode : {0}", result.HttpStatusCode);
if (result.HttpStatusCode != HttpStatusCode.Accepted)
{
    throw new OssException(result.RequestId + ", " + result.HttpStatusCode + " ,");
}
while (maxWaitTimeInSeconds > 0)
{
    var meta = client.GetObjectMetadata(bucketName, objectName);
    string restoreStatus = meta.HttpMetadata["x-oss-restore"] as string;
    if (restoreStatus != null && restoreStatus.StartsWith("ongoing-request=\"false\"", StringComparison.InvariantCultureIgnoreCase))
    {
        break;
    }
    Thread.Sleep(1000);
    // 最長等待時間減少1秒。
    maxWaitTimeInSeconds--;
}
if (maxWaitTimeInSeconds == 0)
{
    Console.WriteLine("RestoreObject is timeout. ");
    throw new TimeoutException();
}
else
{
    Console.WriteLine("RestoreObject is successful. ");
}
// 解凍歸檔檔案。
RestoreObjectRequest restore = new RestoreObjectRequest();
// 填寫Bucket名稱,例如examplebucket。
restore.setBucketName("examplebucket");
// 填寫不包含Bucket名稱在內的Object完整路徑,例如exampleobject.txt。
restore.setObjectKey("exampleobject.txt");
OSSAsyncTask task = oss.asyncRestoreObject(restore, new OSSCompletedCallback<RestoreObjectRequest,
        RestoreObjectResult>() {
    @Override
    public void onSuccess(RestoreObjectRequest request, RestoreObjectResult result) {
        Log.i("info", "code::"+result.getStatusCode());

    }

    @Override
    public void onFailure(RestoreObjectRequest request, ClientException clientException,
                          ServiceException serviceException) {
        Log.e("errorMessage", "error: "+serviceException.getRawMessage());

    }
});

task.waitUntilFinished();
OSSRestoreObjectRequest *request = [OSSRestoreObjectRequest new];
// 填寫Bucket名稱,例如examplebucket。
request.bucketName = @"examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑,例如exampleobject.txt。
request.objectKey = @"exampleobject.txt";

OSSTask *restoreObjectTask = [client restoreObject:request];
[restoreObjectTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (!task.error) {
        NSLog(@"restore object success");
    } else {
        NSLog(@"restore object failed, error: %@", task.error);
    }
    return nil;
}];
// 實現同步阻塞等待任務完成。
// [restoreObjectTask waitUntilFinished];
#include <alibabacloud/oss/OssClient.h>
#include <thread>
#include <chrono>
#include <algorithm>

using namespace AlibabaCloud::OSS;

int main(void)
{
    /*初始化OSS帳號資訊。*/
    
    /*yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    / *yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn - hangzhou。 * /
    std::string Region = "yourRegion";
    /*填寫Bucket名稱,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /*填寫不包含Bucket名稱在內的歸檔類型Object的完整路徑。*/
    std::string ObjectName = "yourObjectName";
  
    /*初始化網路等資源。*/
    InitializeSdk();
    
    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);
  
    /*解凍歸檔Object。*/
    auto outcome = client.RestoreObject(BucketName, ObjectName);
    /*非歸檔Object不能解凍。*/
    if (!outcome.isSuccess()) {
        /*異常處理。*/
        std::cout << "RestoreObject fail,code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }
    std::string onGoingRestore("ongoing-request=\"false\"");
    int maxWaitTimeInSeconds = 600;
    while (maxWaitTimeInSeconds > 0)
    {
        auto meta = client.HeadObject(BucketName, ObjectName);
        std::string restoreStatus = meta.result().HttpMetaData()["x-oss-restore"];
        std::transform(restoreStatus.begin(), restoreStatus.end(), restoreStatus.begin(), ::tolower);
        if (!restoreStatus.empty() && 
        restoreStatus.compare(0, onGoingRestore.size(), onGoingRestore)==0) {
            std::cout << " success, restore status:" << restoreStatus << std::endl;
            /*成功解凍歸檔Object。*/
            break;
        }
        std::cout << " info, WaitTime:" << maxWaitTimeInSeconds
        << "; restore status:" << restoreStatus << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(10));
        maxWaitTimeInSeconds--;     
    }
    if (maxWaitTimeInSeconds == 0)
    {
        std::cout << "RestoreObject fail, TimeoutException" << std::endl;
    }
    /*釋放網路等資源。*/
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
/* yourRegion填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*類型的字串初始化aos_string_t類型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    //需要額外配置以下兩個參數
    aos_str_set(&options->config->region, region);
    options->config->signature_version = 4;
    /* 是否使用了CNAME。0表示不使用。*/
    options->config->is_cname = 0;
    /* 用於設定網路相關參數,比如逾時時間等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程式入口調用aos_http_io_initialize方法來初始化網路、記憶體等全域資源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用於記憶體管理的記憶體池(pool),等價於apr_pool_t。其實現代碼在apr庫中。*/
    aos_pool_t *pool;
    /* 重新建立一個記憶體池,第二個參數是NULL,表示沒有繼承其它記憶體池。*/
    aos_pool_create(&pool, NULL);
    /* 建立並初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全域配置資訊。*/
    oss_request_options_t *oss_client_options;
    /* 在記憶體池中分配記憶體給options。*/  
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的選項oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化參數。*/
    aos_string_t bucket;
    aos_string_t object;   
    aos_table_t *headers = NULL;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    headers = aos_table_make(pool, 0);
       
    /* 解凍檔案。*/
    do {
        headers = aos_table_make(pool, 0);
        resp_status = oss_restore_object(oss_client_options, &bucket, &object, headers, &resp_headers);
        printf("restore object resp_status->code: %d \n", resp_status->code);
        if (resp_status->code != 409) {
            break;
        } else {
            printf("restore object is already in progress, resp_status->code: %d \n", resp_status->code);
            apr_sleep(5000);
        }
    } while (1);
    /* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
    aos_pool_destroy(pool);
    /* 釋放之前分配的全域資源。*/
    aos_http_io_deinitialize();
    return 0;
}
package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定義全域變數
var (
	region     string // 儲存地區
	bucketName string // 儲存空間名稱
	objectName string // 對象名稱
)

// init函數用於初始化命令列參數
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// 解析命令列參數
	flag.Parse()

	// 檢查bucket名稱是否為空白
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 檢查region是否為空白
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 檢查object名稱是否為空白
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 載入預設配置並設定憑證提供者和地區
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 建立OSS用戶端
	client := oss.NewClient(cfg)

	// 建立解凍對象的請求
	request := &oss.RestoreObjectRequest{
		Bucket: oss.Ptr(bucketName), // 儲存空間名稱
		Key:    oss.Ptr(objectName), // 對象名稱
		RestoreRequest: &oss.RestoreRequest{
			Days: 3, // 設定解凍狀態的持續天數為3天
		},
	}

	// 發送解凍對象的請求
	result, err := client.RestoreObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to restore object %v", err)
	}

	// 列印解凍對象的結果
	log.Printf("restore object result:%#v\n", result)
}
<?php

// 引入自動負載檔案,確保依賴庫能夠正確載入
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// 定義命令列參數的描述資訊
$optsdesc = [
    "region" => ['help' => 'The region in which the bucket is located.', 'required' => True], // Bucket所在的地區(必填)
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // 訪問網域名稱(可選)
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // Bucket名稱(必填)
    "key" => ['help' => 'The name of the object', 'required' => True], // 對象名稱(必填)
];

// 將參數描述轉換為getopt所需的長選項格式
// 每個參數後面加上":"表示該參數需要值
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// 解析命令列參數
$options = getopt("", $longopts);

// 驗證必填參數是否存在
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // 擷取參數的協助資訊
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // 如果必填參數缺失,則退出程式
    }
}

// 從解析的參數中提取值
$region = $options["region"]; // Bucket所在的地區
$bucket = $options["bucket"]; // Bucket名稱
$key = $options["key"];       // 對象名稱

// 載入環境變數中的憑證資訊
// 使用EnvironmentVariableCredentialsProvider從環境變數中讀取Access Key ID和Access Key Secret
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// 使用SDK的預設配置
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 設定憑證提供者
$cfg->setRegion($region); // 設定Bucket所在的地區
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // 如果提供了訪問網域名稱,則設定endpoint
}

// 建立OSS用戶端執行個體
$client = new Oss\Client($cfg);

// 建立RestoreObjectRequest對象,用於恢複Archive Storage類型對象
$request = new Oss\Models\RestoreObjectRequest(bucket: $bucket, key: $key);

// 執行恢複對象操作
$result = $client->restoreObject($request);

// 列印恢複結果
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP狀態代碼,例如200表示成功
    'request id:' . $result->requestId . PHP_EOL     // 請求ID,用於調試或追蹤請求
);

使用圖形化管理工具ossbrowser

ossbrowser支援Bucket層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成解凍檔案的操作。關於如何使用ossbrowser,請參見常用操作

使用命令列工具ossutil

您可以使用命令列工具ossutil來解凍檔案,ossutil的安裝請參見安裝ossutil

以下命令用於解凍儲存空間examplebucket中冷歸檔類型的exampleobject。

ossutil api restore-object  --bucket examplebucket --key exampleobject --restore-request "{\"Days\":\"2\"}"

關於該命令的更多資訊,請參見restore-object

相關API

以上操作方式底層基於API實現,如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見RestoreObject

錯誤碼

常見問題