全部產品
Search
文件中心

Object Storage Service:OSS裡的檔案怎麼全部解凍?

更新時間:Jun 19, 2024

如果未開啟歸檔直讀,歸檔類型的Object需要解凍後才能讀取。OSS控制台暫不支援批量解凍某個目錄下的檔案,解凍時需要逐個找到並執行解凍,為減少操作步驟,可以使用其他方式批量對檔案進行解凍操作。本文將介紹批量解凍OSS檔案的具體方法。

解決方案

要批量解凍OSS裡的檔案,您需要按照以下步驟操作:

1.在批量解凍檔案之前,您首先需要列舉出所有檔案。

  • 列舉檔案推進您使用儲存空間清單功能,它可以方便且高效的列舉bucket檔案,尤其是在海量Object的列舉情境中,具體操作,請參見儲存空間清單

  • 除此之外,您也可以通過使用阿雲SDK調用ListObjects的方法來實現相關操作,但是相較使用儲存清單來說產生費用會更多,具體資訊,請參見列舉檔案請求費用

2.篩選清單返回結果欄位中StorageClass類型為歸檔的檔案,並記錄這些檔案不包含bucket名稱在內的完整路徑。

說明

如果您使用的是阿里雲SDK方式擷取列表,例如返回清單中單條資料定義為"s",擷取參數Key及StorageClass,以便篩選名稱+狀態資訊,過濾出目標檔案路徑清單。參考如下

System.out.println("fileurl"+s.getKey()+"&stu:"+s.getStorageClass());

3.使用對應的檔案路徑進行批量解凍。你可按照個人技術棧需求下面3種批量處理方式,具體操作,請參見解凍檔案

  • 命令列工具ossutil:整體來看,相較其他兩種方式來說操作更加簡潔且效率相對較高;缺點是需要瞭解命令列操作。文中以Linux系統為樣本,推薦您在熟悉命令列工具及Linux系統操作時使用。

  • 使用REST API:由於沒有批量解凍的介面,使用REST API發送解凍請求時只能挨個檔案執行調用,直接發起REST API請求需要手動編寫代碼計算簽名,推薦對程式自訂要求較高時使用。

  • 阿里雲SDK:操作相對ossutil來說較為繁瑣,但通用性較強,缺點是要使用編譯工具在本機上運行,且需要有一定的代碼閱讀和修改的能力。本文提供了Java樣本,如需查看,請查閱下方樣本。

Java樣本

補充說明

如果您需要使用阿里雲SDK批量解凍檔案,需要對範例程式碼進行部分修改,由於範例程式碼只展示單檔案解凍操作的相關流程,在需要批量解凍時,首先將過濾出需要解凍的檔案的路徑資訊放入一個清單中,用清單替換樣本中的objectName參數,之後遞迴進行解凍檔案操作即可,具體可參考如下樣本:

說明

此樣本僅展示Java語言批量解凍歸檔檔案相關操作,如需查看文檔解凍是否完成,請參見如何查看OSS檔案解凍是否完成?

如果您需要解凍冷歸檔、深度冷歸檔類型的檔案,請跳轉至SDK簡介,根據需要使用的程式設計語言,查詢對應語言的解凍檔案文檔內容。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;

import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華北2(北京)為例,其它Region請按實際情況填寫。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 建立清單,並添加不包含Bucket名稱在內的歸檔類型Object的完整路徑。
        List<String> filePaths = new ArrayList<>();
        filePaths.add("filePath1");
        filePaths.add("filePath2");

        // 建立OSSClient執行個體。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            for (String filePath : filePaths) {
                ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, filePath);
                // 校正Object是否為歸檔類型Object。
                StorageClass storageClass = objectMetadata.getObjectStorageClass();
                if (storageClass == StorageClass.Archive) {
                    // 解凍Object。
                    ossClient.restoreObject(bucketName, filePath);
                }
                System.out.println(filePath+" start thawing.");
            }
        } 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();
            }
        }
    }
}

相關文檔