すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:複数のオブジェクトを一度に解凍するにはどうすればよいですか?

最終更新日:Jun 10, 2025

アーカイブオブジェクトのリアルタイムアクセスを有効にしていない場合、アーカイブオブジェクトには解凍後にのみアクセスできます。 Object Storage Service (OSS) コンソールを使用すると、一度に 1 つのオブジェクトのみを解凍できます。 OSS コンソールを使用して、ディレクトリ内の複数のオブジェクトを一度に解凍することはできません。複数のオブジェクトを一度に解凍するには、他の方法を使用できます。このトピックでは、複数のオブジェクトを一度に解凍する方法について説明します。

解決策

バケット内の複数のオブジェクトを一度に解凍するには、次の手順を実行します。

1. すべてのオブジェクトをリストします。

  • バケット内のオブジェクトをリストするには、バケットインベントリ機能を使用することをお勧めします。 詳細については、「バケットインベントリ」をご参照ください。

  • ListObjects 操作を呼び出すことによって、オブジェクトをリストすることもできます。ただし、この操作は、インベントリベースのリストよりも高い料金が発生します。 詳細については、「オブジェクトのリスト」および「API 操作呼び出し料金」をご参照ください。

2. バケットインベントリ機能を使用してオブジェクトをリストする場合は、返されたインベントリリストで StorageClass がアーカイブであるオブジェクトをフィルタリングし、バケット名を除くオブジェクトの完全なパスを記録します。

説明

OSS SDK を使用してオブジェクトをリストする場合は、Key と StorageClass の組み合わせを使用して、オブジェクトのパスとそのストレージクラスを取得します。次のサンプルコードは、「s」オブジェクトのパスとそのストレージクラスを返します。

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

3. 対応するパス内のオブジェクトを一度に解凍します。次のいずれかの方法を使用して、複数のオブジェクトを一度に解凍できます。 詳細については、「オブジェクトの解凍」をご参照ください。

  • ossutil: コマンドライン操作に精通している場合、他の 2 つの方法と比較して、ossutil はよりシンプルで効率的に使用できます。

  • OSS API: OSS API は、複数のオブジェクトを一度に解凍するための API 操作を提供していません。解凍するオブジェクトごとに RestoreObject 操作を呼び出す必要があります。操作を呼び出すときは、署名を計算するコードを記述する必要があります。 アプリケーションで高度なカスタマイズが必要な場合は、OSS API を使用することをお勧めします。

  • OSS SDK: ossutil と比較して、OSS SDK の使用はより複雑であり、コードを読み取って変更する機能が必要です。コードはコンパイルされ、ローカルデバイスで実行されます。ただし、OSS SDK はより優れたコードの再利用性を提供します。このトピックの後半では、OSS SDK for Java を使用して複数のオブジェクトを一度に解凍する方法を示すコードサンプルを提供します。

Java の例

追加情報

「オブジェクトの解凍」トピックで提供されている Java サンプルコードは、単一のオブジェクトのみを解凍します。複数のオブジェクトを一度に解凍するには、Java サンプルコードの objectName 変数を、解凍するオブジェクトのパスを格納するリストタイプの変数に置き換えます。次のサンプルコードは、「オブジェクトの解凍」トピックで提供されている Java サンプルコードから変更され、複数のオブジェクトを一度に解凍します。

説明

解凍が完了したかどうかを確認するには、「OSS オブジェクトが解凍されたかどうかを確認するにはどうすればよいですか?」の手順に従います。

コールドアーカイブまたはディープコールドアーカイブオブジェクトを解凍する場合は、「概要」を参照し、対応する [オブジェクトの解凍] トピックへのリンクをクリックしてください。

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

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // この例では、中国 (北京) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // エンドポイントにマップするリージョンの ID を指定します。例: cn-hangzhou。
        String region = "cn-hangzhou";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。例: examplebucket。
        String bucketName = "examplebucket";
        // 解凍するアーカイブオブジェクトの完全なパスのリストを作成します。オブジェクトの完全なパスにバケット名を含めないでください。
        List<String> filePaths = new ArrayList<>();
        filePaths.add("filePath1");
        filePaths.add("filePath2");

        // OSSClient インスタンスを作成します。
        // OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // V4 署名アルゴリズムの使用を明示的に宣言します。
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            for (String filePath : filePaths) {
                ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, filePath);
                // オブジェクトがアーカイブオブジェクトであるかどうかを確認します。
                StorageClass storageClass = objectMetadata.getObjectStorageClass();
                if (storageClass == StorageClass.Archive) {
                    // オブジェクトを解凍します。
                    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();
            }
        }
    }
}

関連情報