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

Object Storage Service:バージョン管理が有効なバケット内のオブジェクトの管理

最終更新日:Dec 06, 2025

バケットのバージョン管理を有効にすると、Object Storage Service (OSS) はバケット内のすべてのオブジェクトに対して一意のバージョン ID を生成します。既存のオブジェクトのコンテンツとアクセス制御リスト (ACL) は変更されません。バージョン管理により、誤ったデータの上書きや削除を防ぎ、オブジェクトの旧バージョンをクエリしたり復元したりできます。

注意事項

バージョン管理が有効なバケットでオブジェクトをアップロード、一覧表示、ダウンロード、削除、復元する際は、以下の点にご注意ください。

  • OSS は、各オブジェクトの現行バージョンと 0 個以上の旧バージョンを格納します。

  • バージョン管理を有効にする前にオブジェクトをアップロードした場合、OSS はそのオブジェクトのバージョン ID を null に設定します。

  • 読みやすさを考慮し、このトピックの図に示されているすべてのバージョン ID は簡略化されています。

詳細については、「バージョン管理の概要」をご参照ください。

オブジェクトのアップロード

バージョン管理が有効なバケットにオブジェクトをアップロードすると、OSS は自動的にオブジェクトに一意のバージョン ID を追加します。

説明

PutObject、PostObject、CopyObject、MultipartUpload などの操作では、新しいオブジェクトバージョンに一意のバージョン ID が自動的に追加されます。

PUT 操作を使用してオブジェクトをアップロードすると、OSS はオブジェクトに一意のバージョン ID (ID=111111) を割り当てます。

同じ名前 (キー=example.jpg) のオブジェクトを再度アップロードすると、元のオブジェクトバージョン (ID=111111) は旧バージョンになります。新しいバージョン (ID=222222) は現行バージョンとして保存されます。オブジェクトを再度アップロードすると、既存のバージョン (ID=111111 および ID=222222) は旧バージョンになり、新しいバージョン (ID=333333) が現行バージョンとして保存されます。

OSS コンソールの使用

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケット をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。

  4. オブジェクト ページで、アップロード をクリックします。

  5. アップロード パネルで、パラメーターを設定します。

    1. 基本オプションを設定します。

      パラメーター

      説明

      アップロード先

      ターゲットバケットにアップロードされた後のファイルのストレージパスを設定します。

      • カレントディレクトリ:ファイルを現在のディレクトリにアップロードします。

      • ディレクトリを指定する:ファイルを指定のディレクトリにアップロードします。ディレクトリ名を入力する必要があります。ディレクトリが存在しない場合、OSS は自動的にディレクトリを作成し、そこにファイルをアップロードします。

        ディレクトリには、次の命名規則に従ってください。

        • UTF-8 文字を使用します。名前は 1~254 文字の長さである必要があります。

        • 名前はスラッシュ (/) またはバックスラッシュ (\) で始めることはできません。

        • 名前に連続するスラッシュ (/) を含めることはできません。

        • 名前を .. にすることはできません。

      オブジェクト ACL

      ファイルの ACL を設定します。

      • [バケットから継承]:オブジェクトの ACL はバケットと同じです。

      • 非公開 (推奨):オブジェクト所有者のみがオブジェクトに対する読み取りおよび書き込み権限を持ちます。他のユーザーはオブジェクトにアクセスできません。

      • 公開読み取り:オブジェクト所有者はオブジェクトに対する読み取りおよび書き込み権限を持ちます。匿名ユーザーを含む他のユーザーはオブジェクトを読み取ることができます。これにより、データ漏洩や料金の増加が発生する可能性があります。注意して使用してください。

      • 公開読み書き:匿名ユーザーを含むすべてのユーザーがオブジェクトにアクセスし、データを書き込むことができます。これにより、データ漏洩や料金の増加が発生する可能性があります。誰かが悪意を持って違法な情報を書き込んだ場合、お客様の法的権利が侵害される可能性があります。必要な場合を除き、オブジェクトに公開読み書き権限を付与しないでください。

      オブジェクト ACL の詳細については、「オブジェクト ACL」をご参照ください。

      アップロードするファイル

      アップロードするファイルまたはフォルダを選択します。

      ファイルの選択 または フォルダーの選択 をクリックして、ローカルのファイルまたはフォルダを選択できます。また、ターゲットのファイルまたはフォルダを [アップロードするファイル] エリアにドラッグすることもできます。

      アップロードするフォルダにアップロードする必要のないファイルが含まれている場合は、ターゲットファイルの [操作] 列にある [削除] をクリックして、ファイルリストから削除します。

      重要
      • バージョン管理が有効になっていないバケットにファイルをアップロードする場合、アップロードされたファイルが既存のファイルと同じ名前であると、既存のファイルは上書きされます。

      • バージョン管理が有効になっているバケットにファイルをアップロードする場合、アップロードされたファイルが既存のファイルと同じ名前であると、アップロードされたファイルが最新バージョンになり、既存のファイルは旧バージョンになります。

    2. 任意: [詳細オプション] の右側にある image.png アイコンをクリックして、ファイルストレージクラスや暗号化メソッドなどの詳細オプションを設定します。

      パラメーター

      説明

      ストレージクラス

      ファイルのストレージクラスを設定します。有効な値:

      • [バケットから継承] (デフォルト):オブジェクトのストレージクラスはバケットと同じです。

      • スタンダード高い信頼性、可用性、および高性能なオブジェクトストレージを提供し、頻繁なデータアクセスをサポートします。ソーシャルメディア、画像・動画共有アプリケーション、大規模なウェブサイト、ビッグデータ分析など、さまざまなシナリオに適しています。標準ストレージは、ゾーン冗長ストレージ (ZRS) とローカル冗長ストレージ (LRS) の両方をサポートします。

      • [低頻度アクセス]標準ストレージよりも低コストで耐久性のあるオブジェクトストレージを提供します。最小課金サイズは 64 KB、最小ストレージ期間は 30 日です。リアルタイムのデータアクセスをサポートします。データにアクセスすると、データ取得料金が発生します。このストレージクラスは、月に 1~2 回など、アクセス頻度が低いシナリオに適しています。低頻度アクセスストレージは、ZRS と LRS の両方をサポートします。

      • [アーカイブストレージ]非常に低コストで耐久性のあるオブジェクトストレージを提供します。最小課金サイズは 64 KB、最小ストレージ期間は 60 日です。アーカイブストレージのデータは、解凍後 (約 1 分かかります) にアクセスするか、直接アクセスできます。解凍されたデータにはデータ取得料金が発生します。アーカイブオブジェクトのリアルタイムアクセスには、直接アクセス料金が発生します。アーカイブストレージは、アーカイブ、医療画像、科学データ、ビデオ映像などの長期データ保持 (LTR) シナリオに適しています。アーカイブストレージは、ZRS と LRS の両方をサポートします。

      • [コールドアーカイブ]アーカイブストレージよりも低コストで耐久性のあるオブジェクトストレージを提供します。最小課金サイズは 64 KB、最小ストレージ期間は 180 日です。データにアクセスする前に解凍する必要があります。解凍時間は、データサイズと選択した解凍モードによって異なります。解凍には、データ取得料金とリクエスト料金が発生します。このストレージクラスは、コンプライアンスのために保持されるデータ、ビッグデータや人工知能 (AI) 分野で蓄積された生データ、映画業界で保持されるメディアリソース、オンライン教育業界でアーカイブされたビデオなど、非常にコールドなデータを超長期間保存する必要があるシナリオに適しています。コールドアーカイブは LRS のみをサポートします。

      • [ディープコールドアーカイブ]コールドアーカイブよりも低コストで耐久性のあるオブジェクトストレージを提供します。最小課金サイズは 64 KB、最小ストレージ期間は 180 日です。データにアクセスする前に解凍する必要があります。解凍時間は、データサイズと選択した解凍モードによって異なります。解凍には、データ取得料金とリクエスト料金が発生します。このストレージクラスは、ビッグデータや AI 分野での生データの長期保持、メディアデータの長期保持、規制およびコンプライアンスアーカイブ、テープの置き換えなど、非常にコールドなデータを超長期間保存する必要があるシナリオに適しています。ディープコールドアーカイブは LRS のみをサポートします。

      詳細については、「ストレージクラス」をご参照ください。

      暗号化の方法

      ファイルのサーバーサイド暗号化方式を設定します。有効な値:

      • バケットから継承 (デフォルト):オブジェクトのサーバーサイド暗号化方式はバケットと同じです。

      • [OSS マネージド]:OSS が管理するキーを使用して暗号化します。OSS はオブジェクトごとに異なるキーを使用します。追加の保護レイヤーとして、OSS はマスターキーを使用して暗号鍵自体を暗号化します。

      • [KMS]:KMS が管理するデフォルトのカスタマーマスターキー (CMK) または指定された CMK ID を使用して暗号化および復号します。

        KMS 暗号化を使用する前に、KMS を有効化する必要があります。詳細については、「KMS の有効化」をご参照ください。

        以下に KMS の [暗号鍵] について説明します。

        暗号鍵のフォーマットは <alias>(CMK ID) です。<alias> は CMK のエイリアスで、CMK ID は CMK の ID です。有効な値:

        • [alias/acs/oss(CMK ID)]:デフォルトの管理された CMK を使用して、異なるオブジェクトを暗号化するために異なるキーを生成します。オブジェクトはダウンロード時に自動的に復号されます。

        • [alias/<cmkname>(CMK ID)]:指定された CMK を使用して、異なるオブジェクトを暗号化するために異なるキーを生成します。オブジェクトの暗号化に使用された CMK ID は、オブジェクトのメタデータに記録されます。復号権限を持つユーザーがオブジェクトをダウンロードすると、自動的に復号されます。<cmkname> は、キー作成時に設定されたマスターキーのオプションの識別子です。

          指定された CMK ID を使用する前に、KMS コンソールでバケットと同じリージョンに通常のキーまたは外部キーを作成する必要があります。詳細については、「CMK の作成」をご参照ください。

      • 暗号化アルゴリズムAES256 暗号化アルゴリズムのみがサポートされています。

      ユーザー定義のメタデータ

      オブジェクトに説明情報を追加するために使用されます。複数のユーザー定義メタデータ (User Meta) を追加できますが、合計サイズは 8 KB を超えることはできません。ユーザー定義メタデータを追加する場合、パラメーターは x-oss-meta- プレフィックスで始まり、値が割り当てられている必要があります。例:[x-oss-meta-location:hangzhou]

    3. アップロード をクリックします。

      その後、[タスク] パネルの タスクのアップロード タブで各ファイルのアップロード進捗を確認できます。

Alibaba Cloud 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.*;
import java.io.ByteArrayInputStream;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
        String objectName = "exampledir/object";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Region を cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 次の例は、文字列をアップロードする方法を示しています。
            String content = "Hello OSS";
            PutObjectResult result = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            // アップロードされたオブジェクトのバージョン ID を表示します。
            System.out.println("result.versionid: " + result.getVersionId());
        } 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();
            }
        }
    }
}
const OSS = require('ali-oss');

const client = new OSS({
  // region をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、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 をご利用のバケット名に設定します。
  bucket: 'yourbucketname'
});

async function put() {
  const result = await client.put('fileName', path.normalize('D:\\localpath\\examplefile.txt'));
  console.log(result.res.headers['x-oss-version-id']); // アップロードされたオブジェクトのバージョン ID を表示します。
}
put();
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;

// yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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");
// bucketName をバケットの名前に設定します。例:examplebucket。
var bucketName = "examplebucket";
// objectName をオブジェクトの完全なパスに設定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// region をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、region を cn-hangzhou に設定します。
const string region = "cn-hangzhou";

// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();

// 署名バージョン 4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;

// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    // オブジェクトをアップロードします。
    var result = client.PutObject(bucketName, objectName, requestContent);
    Console.WriteLine("Put object succeeded versionid : {0}", result.VersionId);
}
catch (Exception ex)
{
    Console.WriteLine("Put object failed, {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。*/
            
    /* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
    std::string Endpoint = "yourEndpoint";
    /* yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。*/
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* ネットワークリソースを初期化します。*/
    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);
    std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
    *content << "test cpp sdk";
    PutObjectRequest request(BucketName, ObjectName, content);

    /* ファイルをアップロードします。*/
    auto outcome = client.PutObject(request);

    if (outcome.isSuccess()) {
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
        /* 例外を処理します。*/
        std::cout << "PutObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。*/
    ShutdownSdk();
    return 0;
}
package main

import (
	"context"
	"flag"
	"log"
	"strings"

	"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()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// アップロードするコンテンツを指定します。
	content := "hi oss"

	// デフォルトの構成をロードし、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトをアップロードするリクエストを作成します。
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName),        // バケットの名前。
		Key: oss.Ptr(objectName),        // オブジェクトの名前。
		Body:   strings.NewReader(content), // アップロードするコンテンツ。
	}

	// オブジェクトをアップロードするリクエストを実行します。
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put object %v", err)
	}

	// オブジェクトのバージョン ID を表示します。
	log.Printf("put object result versionId:%#v\n", *result.VersionId)
}
import argparse
import requests
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサーを作成します。
parser = argparse.ArgumentParser(description="put object sample")
# バケットが配置されているリージョンを指定するための --region コマンドライン引数を設定します。この引数は必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定するための --bucket コマンドライン引数を設定します。この引数は必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定するための --endpoint コマンドライン引数を設定します。この引数はオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定するための --key コマンドライン引数を設定します。この引数は必須です。
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 パラメーターが提供されている場合は、エンドポイントを指定します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 構成を使用して OSSClient インスタンスを作成します。
    client = oss.Client(cfg)

    # ローカルファイルをアップロードします。
    local_file_path = '/yourLocalFilePath/yourFileName'
    with open(local_file_path, 'rb') as file:
        data = file.read()

    # オブジェクトをアップロードするリクエストを実行し、バケット名、オブジェクト名、およびデータコンテンツを指定します。
    result = client.put_object(oss.PutObjectRequest(
        bucket=args.bucket,
        key=args.key,
        body=data,
    ))

    # 応答の HTTP ステータスコード、リクエスト ID、およびオブジェクトの MD5 ハッシュ、ETag、CRC-64 値、バージョン ID を表示して、リクエストが成功したかどうかを確認します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content md5: {result.content_md5},'
          f' etag: {result.etag},'
          f' hash crc64: {result.hash_crc64},'
          f' version id: {result.version_id},'
    )

if __name__ == "__main__":
    main()  # スクリプトのエントリポイント。スクリプトが直接実行されるときに main() 関数を呼び出します。
<?php

// 依存関係をロードするために autoload ファイルをインクルードします。
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], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS', 'required' => False], // (オプション) OSS エンドポイントを指定します。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // (必須) バケットの名前を指定します。
    "key" => ['help' => 'The name of the object', 'required' => True], // (必須) オブジェクトの名前を指定します。
];

// コマンドラインパラメーターを解析するためのロングオプションのリストを生成します。
$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"; // 必須だが欠落しているパラメーターを表示します。
        exit(1);
    }
}

// コマンドラインパラメーターの値を取得し、変数に割り当てます。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// 環境変数から AccessKey ID と AccessKey Secret をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();

// 認証情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// アップロードするデータを指定します。
$data = 'Hello OSS';

// 簡単なアップロードリクエストを作成します。
$request = new Oss\Models\PutObjectRequest(
                bucket: $bucket,
                key: $key,
            );

// リクエストボディをデータストリームに設定します。
$request->body = Oss\Utils::streamFor($data);

// putObject メソッドを使用してデータをアップロードします。
$result = $client->putObject($request);

// 返された結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。
    'request id:' . $result->requestId . PHP_EOL . // リクエスト ID。
    'etag:' . $result->etag . PHP_EOL // オブジェクトの ETag。
);

ossutil の使用

ossutil を使用してバージョン管理が有効なバケットに簡単なアップロードを実行する方法の詳細については、「cp (ファイルのアップロード)」をご参照ください。

REST API の使用

プログラムでより多くのカスタムオプションが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「PutObject」をご参照ください。

オブジェクトの一覧表示

バージョン管理が有効なバケットでは、GetBucketVersions (ListObjectVersions) 操作を使用して、削除マーカーを含むすべてのオブジェクトバージョンの情報を取得できます。

  • GetBucket (ListObject) 操作は、オブジェクトの現行バージョンのみを返し、現行バージョンが削除マーカーではないオブジェクトのみを返します。

  • 1 回の GetBucketVersions (ListObjectVersions) リクエストで返されるオブジェクトバージョンは最大 1,000 個です。複数のリクエストを送信して、すべてのオブジェクトバージョンを取得できます。

    たとえば、バケットに 2 つのキー (example.jpg と photo.jpg など) が含まれ、example.jpg には 900 のバージョン、photo.jpg には 500 のバージョンがある場合、1 回のリクエストで example.jpg の 900 バージョンと photo.jpg の 100 バージョンがアルファベット順およびバージョン順に一覧表示されます。

次の図に示すように、バージョン管理が有効なバケットで GetBucketVersions (ListObjectVersions) 操作を呼び出すと、現行バージョンが削除マーカーであるオブジェクトを含む、バケット内のすべてのオブジェクトのすべてのバージョンが返されます。GetBucket (ListObject) 操作を呼び出すと、オブジェクトの現行バージョンのみが返され、現行バージョンは削除マーカーであってはなりません。たとえば、図に示されているオブジェクトは、現行バージョンが削除マーカーであるため、GetBucket (ListObject) の呼び出しでは返されません。

OSS コンソールの使用

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで バケット をクリックします。[バケットリスト] ページで、ターゲットバケットの名前をクリックします。

    現在のページには、バケット内のすべてのオブジェクトの現行バージョンが表示されます。削除マーカーを含むすべてのバージョンを表示するには、オブジェクト ページの 以前のバージョン の横にある 表示 をクリックします。

Alibaba Cloud 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 {
        // エンドポイントを設定します。この例では、中国 (杭州) リージョンのパブリックエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を指定します。例:examplebucket。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 削除マーカーを含むすべてのオブジェクトのバージョンを一覧表示します。
            String nextKeyMarker = null;
            String nextVersionMarker = null;
            VersionListing versionListing = null;
            do {
                ListVersionsRequest listVersionsRequest = new ListVersionsRequest()
                        .withBucketName(bucketName)
                        .withKeyMarker(nextKeyMarker)
                        .withVersionIdMarker(nextVersionMarker);

                versionListing = ossClient.listVersions(listVersionsRequest);
                for (OSSVersionSummary ossVersion : versionListing.getVersionSummaries()) {
                    System.out.println("key name: " + ossVersion.getKey());
                    System.out.println("versionid: " + ossVersion.getVersionId());
                    System.out.println("Is latest: " + ossVersion.isLatest());
                    System.out.println("Is delete marker: " + ossVersion.isDeleteMarker());
                }

                nextKeyMarker = versionListing.getNextKeyMarker();
                nextVersionMarker = versionListing.getNextVersionIdMarker();
            } while (versionListing.isTruncated());
        } 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();
            }
        }
    }
}
const OSS = require("ali-oss");

const client = new OSS({
  // region をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、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: 'yourbucketname'
});

// 削除マーカーを含むすべてのオブジェクトのバージョン情報を一覧表示します。
async function getObjectVersions() {
  let nextKeyMarker = null;
  let nextVersionMarker = null;
  let versionListing = null;
  do {
    versionListing = await client.getBucketVersions({
      keyMarker: nextKeyMarker,
      versionIdMarker: nextVersionMarker,
    });

    versionListing.objects.forEach((o) => {
      console.log(`${o.name}, ${o.versionId}`);
    });
    versionListing.deleteMarker.forEach((o) => {
      console.log(`${o.name}, ${o.versionId}`);
    });

    nextKeyMarker = versionListing.NextKeyMarker;
    nextVersionMarker = versionListing.NextVersionIdMarker;
  } while (versionListing.isTruncated);
}

getObjectVersions();
import argparse
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサーを作成し、スクリプトの目的を記述します。
parser = argparse.ArgumentParser(description="list object versions sample")

# バケットが配置されているリージョンを示す --region パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を示す --bucket パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# バケットが配置されているリージョンのエンドポイントを示す --endpoint パラメーターを指定します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')

def main():
    # コマンドライン引数を解析して、指定された値を取得します。
    args = parser.parse_args()

    # 環境変数から、OSS へのアクセスに必要な認証情報をロードします。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # デフォルト構成を使用して cfg オブジェクトを作成し、認証情報プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # カスタムエンドポイントが提供されている場合は、cfg オブジェクトの endpoint 属性を更新します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 上記の設定を使用して OSSClient インスタンスを初期化します。
    client = oss.Client(cfg)

    # ページごとにオブジェクトバージョンを一覧表示するために使用される Paginator オブジェクトを作成します。
    paginator = client.list_object_versions_paginator()

    # ページを反復処理します。
    for page in paginator.iter_page(oss.ListObjectVersionsRequest(
            bucket=args.bucket,  # バケット名。
        )
    ):
        # 現在のページのオブジェクトバージョンを反復処理します。
        for o in page.version:
            # 各オブジェクトバージョンに関する次の情報を出力します:
            # - key: オブジェクトキー。
            # - size: オブジェクトサイズ (バイト)。
            # - version_id: バージョン ID。
            # - last_modified: 最終更新日時。
            print(f'Object version: {o.key}, Size: {o.size}, Version_id: {o.version_id}, Last_modified: {o.last_modified}')


# スクリプトが直接実行されるときに main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
    main()  # スクリプトのエントリポイントを指定します。制御フローはここから始まります。

ossutil の使用

バージョン管理が有効なバケット内のオブジェクトを一覧表示する方法の詳細については、「ls (リソースの一覧表示)」をご参照ください。

REST API の使用

プログラムでより多くのカスタムオプションが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「ListObjectVersions (GetBucketVersions)」をご参照ください。

オブジェクトのダウンロード

バージョン管理が有効なバケットから、オブジェクトの現行バージョンまたは特定のバージョンをダウンロードできます。

GET リクエストでバージョン ID を指定せずにオブジェクトをダウンロードすると、現行バージョン (ID=333333) が返されます。

現行バージョンが削除マーカーの場合、GET リクエストを送信すると OSS は 404 Not Found を返します。

GET リクエストでオブジェクトをダウンロードする際に、バージョン ID を指定して特定のバージョン (ID=222222) を取得できます。

OSS コンソールの使用

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケット をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。

  4. オブジェクト ページで、以前のバージョン の横にある 表示 をクリックします。

  5. ダウンロードしたいオブジェクトバージョンをクリックします。表示されたパネルで、[URL] の横にある [ダウンロード] をクリックします。

Alibaba Cloud SDK の使用

以下のサンプルコードは、一般的な SDK を使用してバージョン管理が有効なバケットからオブジェクトをダウンロードする方法を示しています。他の SDK を使用してオブジェクトをダウンロードする方法については、「SDK」をご参照ください。

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンの場合、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,
  // yourbucketname をバケットの名前に設定します。
  bucket: 'yourbucketname'
});

async function get() {
  // ファイルの名前。
  const result = await client.get('filename', {    
      // ダウンロードするファイルのバージョン ID。
      versionId: 'versionid',
  });
  console.log(result.content);
}
get();
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。*/
            
    /* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
    std::string Endpoint = "yourEndpoint";
    /* yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。*/
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* ネットワークリソースを初期化します。*/
    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);

    /* ファイルをローカルメモリにダウンロードします。*/
    GetObjectRequest request(BucketName, ObjectName);
    request.setVersionId("yourObjectVersionId");
    auto outcome = client.GetObject(request);
    if (outcome.isSuccess()) {
        std::cout << "getObjectToBuffer" << " success, Content-Length:" << outcome.result().Metadata().ContentLength() << std::endl;
        /* ダウンロードしたオブジェクトのコンテンツを読み取ります。*/
        std::string content;
        *(outcome.result().Content()) >> content;
        std::cout << "getObjectToBuffer" << "content:" << content << std::endl;
        /* ダウンロードしたオブジェクトのバージョン ID を表示します。*/
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
            /* 例外を処理します。*/
            std::cout << "getObjectToBuffer fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。*/
    ShutdownSdk();
    return 0;
}
import argparse
import alibabacloud_oss_v2 as oss

# コマンドラインパラメーターパーサーを作成します
parser = argparse.ArgumentParser(description="get object sample")

# バケットが配置されているリージョンを示す --region パラメーターを指定します。このパラメーターは必須です。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# バケットの名前を指定する --bucket パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# バケットが配置されているリージョンのエンドポイントを示す --endpoint パラメーターを指定します。このパラメーターはオプションです。
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# オブジェクトの名前を指定する --key パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--key', help='The name of the object.', required=True)
# ソースオブジェクトのバージョン ID を指定する --version_id パラメーターを指定します。このコマンドラインパラメーターは必須です。
parser.add_argument('--version_id', help='The version ID 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 パラメーターが提供されている場合は、エンドポイントを指定します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 構成を使用して OSSClient インスタンスを作成します。
    client = oss.Client(cfg)

    # オブジェクトをダウンロードするリクエストを実行し、バケット名とオブジェクト名を指定します。
    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,  # バケットの名前を指定します。
        key=args.key,  # オブジェクトの名前を指定します。
        version_id=args.version_id, # バージョン ID を指定します。
    ))

    # 応答を表示して、リクエストが成功したかどうかを確認します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content length: {result.content_length},'
          f' content range: {result.content_range},'
          f' content type: {result.content_type},'
          f' etag: {result.etag},'
          f' last modified: {result.last_modified},'
          f' content md5: {result.content_md5},'
          f' cache control: {result.cache_control},'
          f' content disposition: {result.content_disposition},'
          f' content encoding: {result.content_encoding},'
          f' expires: {result.expires},'
          f' hash crc64: {result.hash_crc64},'
          f' storage class: {result.storage_class},'
          f' object type: {result.object_type},'
          f' version id: {result.version_id},'
          f' tagging count: {result.tagging_count},'
          f' server side encryption: {result.server_side_encryption},'
          f' server side data encryption: {result.server_side_data_encryption},'
          f' next append position: {result.next_append_position},'
          f' expiration: {result.expiration},'
          f' restore: {result.restore},'
          f' process status: {result.process_status},'
          f' delete marker: {result.delete_marker},'
    )

    # オブジェクトのコンテンツを読み取ります。
    content = result.body.read()

    # コンテンツをローカルファイルに保存します。この例では、ローカルファイル名は test.txt です。
    with open('./test.txt', 'wb') as f:
        f.write(content)

    print(f'File saved to test.txt successfully!')

# スクリプトが直接実行されるときに main 関数を呼び出します。
if __name__ == "__main__":
    main()  # スクリプトが直接実行される際のスクリプトのメイン関数のエントリポイントを指定します。
package main

import (
	"context"
	"flag"
	"io"
	"log"
	"os"

	"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()

	// バケットの名前が指定されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクトの名前が指定されているかどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 出力ファイルのパスを指定します。
	outputFile := "downloaded.file" // このパラメーターをファイルを保存したいパスに置き換えます。

	// デフォルトの構成をロードし、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// クエリリクエストを作成します。
	request := &oss.GetObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // バケットの名前
		Key:       oss.Ptr(objectName),      // オブジェクトの名前
		VersionId: oss.Ptr("yourVersionId"), // オブジェクトのバージョン ID
	}

	// クエリ操作を実行し、結果を処理します。
	result, err := client.GetObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to get object %v", err)
	}
	defer result.Body.Close() // 関数が完了したときにレスポンスボディが閉じられることを確認します。

	// ファイル全体を読み取ります。
	data, err := io.ReadAll(result.Body)
	if err != nil {
		log.Fatalf("failed to read object %v", err)
	}

	// コンテンツをファイルに書き込みます。
	err = os.WriteFile(outputFile, data, 0644)
	if err != nil {
		log.Fatalf("failed to write to output file %v", err)
	}

	log.Printf("file downloaded successfully to %s", outputFile)
}
<?php

// 依存ライブラリをロードするために autoload ファイルを導入します。
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], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // (必須) バケットの名前を指定します。
    "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 = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// 環境変数からアクセス認証情報をロードします。
// EnvironmentVariableCredentialsProvider を使用して、環境変数から AccessKey ID と AccessKey Secret を取得します。    
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合は、エンドポイントを指定します。
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// 指定されたオブジェクトのコンテンツを取得するための GetObjectRequest オブジェクトを作成します。
$request = new Oss\Models\GetObjectRequest(
                bucket: $bucket,
                key: $key,
                versionId:"yourVersionId",// オブジェクトのバージョン ID を指定します。
);

// オブジェクトをクエリします。
$result = $client->getObject($request);

// オブジェクトを保存するローカルパスを指定します。
$localFilePath = './test/file.txt'; // このパラメーターを実際のローカルファイルパスに置き換えます。

// コンテンツをローカルファイルに書き込みます。
file_put_contents($localFilePath, $result->body->getContents());

// 結果を表示します。
// HTTP ステータスコード、リクエスト ID、およびオブジェクトのコンテンツを出力します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、HTTP ステータスコード 200 はリクエストが成功したことを示します。
    'request id:' . $result-> requestId. PHP_EOL // リクエスト ID。リクエストのデバッグまたは追跡に使用されます。
);

ossutil の使用

ossutil を使用してバージョン管理が有効なバケットからオブジェクトをダウンロードする方法の詳細については、「cp (ファイルのダウンロード)」をご参照ください。

REST API の使用

プログラムでより多くのカスタムオプションが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「GetObject」をご参照ください。

オブジェクトの削除

バージョン管理を有効にした後、バージョン ID を指定するか、ライフサイクルルールを設定することで、オブジェクトを完全に削除できます。バージョン ID を指定せずにオブジェクトを削除すると、削除マーカーがバケットに現行バージョンとして挿入されます。

重要
  • バージョン管理を有効にした後、バージョン ID を指定せずにオブジェクトを削除した場合、オブジェクトの現行バージョンと旧バージョンはデフォルトでは削除されません。

  • OSS-HDFS とバージョン管理を同時にバケットで有効にしないでください。そうしないと、OSS-HDFS が期待どおりに動作しない可能性があります。OSS-HDFS の安定性を確保するためには、できるだけ早くバージョン管理を一時停止し、ライフサイクルルールを設定して削除マーカーを削除する必要があります。

    詳細については、「OSS-HDFS サービスとバージョン管理の両方が有効になっているバケットをどのように処理すればよいですか?」をご参照ください。

また、ライフサイクルルールの Expiration 要素を指定してオブジェクトの現行バージョンを期限切れにするか、NoncurrentVersionExpiration 要素を使用して現行バージョンではないオブジェクトバージョンを完全に削除することもできます。詳細は次のとおりです。

  • Expiration:現行オブジェクトバージョンに適用されます。オブジェクトが期限切れになると、OSS はオブジェクトに削除マーカーを追加します。これにより、削除マーカーが新しい現行バージョンになり、期限切れのオブジェクトは現行バージョンではないバージョンになります。

  • NoncurrentVersionExpiration:現行バージョンではないオブジェクトバージョンに適用されます。これらのオブジェクトバージョンを完全に削除します。

バージョン管理とライフサイクルルールの使用に関する詳細については、「ライフサイクル構成要素」をご参照ください。

DELETE 操作の動作は、バージョン ID を指定するかどうかによって異なります。

  • オブジェクトのバージョン ID を指定しない場合、OSS は削除マーカーを現行バージョンとして挿入します。削除マーカーには一意のバージョン ID がありますが、関連するデータや ACL はありません。次の図は、現行バージョンがバージョン ID=444444 の削除マーカーである例を示しています。

  • オブジェクトのバージョン ID を指定すると、その特定のバージョンのオブジェクトが完全に削除されます。次の図は、ID=333333 のオブジェクトバージョンが削除される例を示しています。

OSS コンソールの使用

ストレージコストを最小限に抑えるために、不要になったオブジェクトの旧バージョンはできるだけ早く削除することを推奨します。

警告

旧オブジェクトバージョンは削除されると復元できません。注意して使用してください。

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケット をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。

  4. オブジェクト ページで、以前のバージョン の横にある 表示 をクリックします。

  5. 不要になった旧オブジェクトバージョンを見つけて、次のように削除します。

    • 削除したい旧オブジェクトバージョンが削除マーカーの場合は、[操作] 列の 完全に削除 をクリックします。

    • 削除したいオブジェクトの以前のバージョンが削除マーカーではない場合、[アクション] 列の image.png アイコンにポインターを移動し、完全に削除 をクリックします。

    複数の旧バージョンを選択して一括で削除し、ページ下部の 完全に削除 をクリックすることもできます。

  6. OK をクリックします。

    ライフサイクルルールを設定して、旧オブジェクトバージョンを自動的かつ定期的に削除することもできます。詳細については、「ライフサイクルルールの概要」をご参照ください。

Alibaba Cloud SDK の使用

以下のサンプルコードは、一般的な SDK を使用してバージョン管理が有効なバケットから特定のバージョンのファイルを削除する方法を示しています。他の SDK を使用して特定のバージョンのファイルを削除する方法については、「SDK」をご参照ください。

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // この例では中国 (杭州) リージョンを使用します。実際のリージョンとエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を設定します。例:examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めることはできません。
        String objectName = "exampledir/object";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        // バケットが配置されているリージョンを設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 指定されたバージョンのオブジェクトを削除します。
            ossClient.deleteVersion(bucketName, objectName , versionId);
        } 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();
            }
        }
    }
}
const OSS = require("ali-oss");

const client = new OSS({
  // yourregion をバケットが配置されているリージョンに置き換えます。たとえば、バケットが中国 (杭州) リージョンにある場合、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,
  // yourbucketname をバケット名に置き換えます。
  bucket: 'yourbucketname'
});

// オブジェクトの versionId を指定します。
const versionId = "versionId";
// オブジェクトを指定します。
const objectName = "exampleobject.txt";
async function deleteVersionObject() {
  const result = await client.delete(objectName, {
    versionId,
  });
  console.log(result);
}

deleteVersionObject();
using Aliyun.OSS;
using Aliyun.OSS.Common;

// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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");
// バケットの名前を指定します。例:examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例:exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// オブジェクトまたは削除マーカーのバージョン ID を指定します。
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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
{
    // 削除したいオブジェクトまたは削除マーカーのバージョン ID を指定します。
    var request = new DeleteObjectRequest(bucketName, objectName)
    {
        VersionId = versionid
    };
    client.DeleteObject(request);
    Console.WriteLine("Delete object succeeded");
}
catch (Exception ex)
{
    Console.WriteLine("Delete object failed. {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。*/
            
    /* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
    std::string Endpoint = "yourEndpoint";
    /* yourRegion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* バケット名を指定します。例:examplebucket。*/
    std::string BucketName = "examplebucket";
    /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* ネットワークリソースを初期化します。*/
    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);

    /* 指定された versionId のオブジェクト、または指定された versionId を持つ削除マーカーに関連付けられたオブジェクトを削除します。*/
    auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
    /* オブジェクトの versionId が指定されている場合、返される delete_marker は None で、返される versionId は指定されたオブジェクトの versionId です。*/
    /* 削除マーカーの versionId が指定されている場合、返される delete_marker は True で、返される versionId は指定された削除マーカーの versionId です。*/
    if (!outcome.isSuccess()) {
        /* 例外を処理します。*/
        std::cout << "DeleteObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。*/
    ShutdownSdk();
    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()

	// バケットの名前が指定されているかどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクトの名前が指定されているかどうかを確認します。
	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.DeleteObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // バケットの名前。
		Key:       oss.Ptr(objectName),      // オブジェクトの名前。
		VersionId: oss.Ptr("yourVersionId"), // オブジェクトのバージョン ID。
	}

	// オブジェクトを削除し、結果を処理します。
	result, err := client.DeleteObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to delete object %v", err)
	}

	// 削除の結果を表示します。
	log.Printf("delete object result:%#v\n", result)
}
<?php

// 依存ライブラリが正しくロードされるように、autoloader ファイルをインポートします。
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], // バケットが配置されているリージョン。このパラメーターは必須です。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // エンドポイント。このパラメーターはオプションです。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // バケット名。このパラメーターは必須です。
    "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 = $options["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); // バケットが配置されているリージョンを設定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合は、エンドポイントを設定します。
}

// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);

// 指定されたオブジェクトを削除するための DeleteObjectRequest オブジェクトを作成します。
$request = new Oss\Models\DeleteObjectRequest(
            bucket: $bucket,
            key: $key,
            versionId:"yourversionid", // 削除するオブジェクトのバージョン番号を指定します。
);

// オブジェクト削除操作を実行します。
$result = $client->deleteObject($request);

// 削除結果を出力します。
// HTTP ステータスコードとリクエスト ID を出力して、削除が成功したかどうかを確認します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、204 は削除が成功したことを示します。
    'request id:' . $result->requestId . PHP_EOL     // リクエスト ID。リクエストのデバッグや追跡に使用されます。
);

ossutil の使用

ossutil を使用してバージョン管理が有効なバケットからオブジェクトを削除する方法の詳細については、「rm (削除)」をご参照ください。

REST API の使用

プログラムでより多くのカスタムオプションが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「DeleteObject」をご参照ください。

オブジェクトの復元

バージョン管理を有効にすると、バケット内のオブジェクトのすべてのバージョンが保持されます。特定の旧バージョンのオブジェクトを復元して、現行バージョンにすることができます。

次の 2 つの方法のいずれかで、オブジェクトの旧バージョンを復元できます。

  • CopyObject を使用してオブジェクトの旧バージョンを復元する

    コピーされたオブジェクトがオブジェクトの現行バージョンになり、すべてのオブジェクトバージョンは保持されます。

    次の図に示すように、元のオブジェクトの旧バージョン (ID=222222) が同じバケットにコピーされます。OSS はオブジェクトの新しいバージョン (ID=444444) を生成し、それを現行バージョンとして設定します。したがって、オブジェクトには旧バージョン (ID=222222) と現行バージョン (ID=444444) の両方が存在します。

  • オブジェクトの現行バージョンを削除して旧バージョンを復元する

    次の図に示すように、DELETE リクエストでバージョン ID を指定して現行のオブジェクトバージョン (ID=222222) を完全に削除すると、次の旧バージョン (ID=111111) がオブジェクトの現行バージョンになります。

重要

オブジェクトの現行バージョンは削除されると復元できないため、CopyObject を使用してオブジェクトの旧バージョンを復元することを推奨します。

OSS コンソールの使用

  1. OSS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケット をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。

  4. オブジェクト ページで、以前のバージョン の横にある 表示 をクリックします。

  5. 特定の旧バージョンのオブジェクトを現行バージョンに復元します。

    重要

    一度に復元できるオブジェクトの旧バージョンは 1 つだけです。復元したい旧バージョンは削除マーカーであってはなりません。

    • 単一オブジェクトの復元

      ターゲットの旧バージョンの [操作] 列にある 回復 をクリックします。

    • 複数オブジェクトの復元

      ターゲットの旧バージョンを選択し、ページ下部の 回復 をクリックし、表示されるダイアログボックスで [OK] をクリックします。

Alibaba Cloud 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 {
        // この例では、中国 (杭州) リージョンのエンドポイントを使用します。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // ソースバケットの名前を指定します。
        String sourceBucketName = "srcexamplebucket";
        // ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
        String sourceObjectName = "srcexampleobject.txt";
        // 宛先バケットの名前を指定します。宛先バケットはソースバケットと同じリージョンにある必要があります。
        String destinationBucketName = "desexamplebucket";
        // 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
        String destinationObjectName = "desexampleobject.txt";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
            copyObjectRequest.setSourceVersionId(versionId);
            CopyObjectResult copyObjectResult = ossClient.copyObject(copyObjectRequest);
            System.out.println("ETag: " + copyObjectResult.getETag() + " LastModified: " + copyObjectResult.getLastModified());
            System.out.println("dest object versionid: " + copyObjectResult.getVersionId());
        } 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();
            }
        }
    }
}
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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,
  // yourbucketname をバケットの名前に設定します。
  bucket: 'yourbucketname'
});

// ソースオブジェクトの versionId を指定します。
const versionId = 'versionId';
// ソースオブジェクトを指定します。
const srcObject = 'srcObject.txt';
// ソースバケットを指定します。
const srcBucket = 'srcBucket';
// 宛先オブジェクトを指定します。
const targetObject = 'targetObject.txt';
async function Copy() {
  try {
    const result = await client.copy(targetObject, srcObject, srcBucket, {
      meta: {
        versionId: versionId
      }
    });

    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

Copy()
using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを 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");
// ソースバケットの名前を指定します。
var sourceBucket = "yourSourceBucketName";
// ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
var sourceObject = "yourSourceObjectName";
// 宛先バケットの名前を指定します。宛先バケットはソースバケットと同じリージョンに配置されている必要があります。
var targetBucket = "yourDestBucketName";
// 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。
var targetObject = "yourDestObjectName";
// ソースオブジェクトのバージョン ID を指定します。
var versionid = "yourArchiveObjectVersionid";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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
{
    var metadata = new ObjectMetadata();
    metadata.AddHeader("mk1", "mv1");
    metadata.AddHeader("mk2", "mv2");
    var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
    {
        // NewObjectMetadata の値が null の場合、COPY モードが使用され、ソースオブジェクトのメタデータが宛先オブジェクトにコピーされます。NewObjectMetadata の値が null でない場合、REPLACE モードが使用され、ソースオブジェクトのメタデータが宛先オブジェクトのメタデータを上書きします。
        NewObjectMetadata = metadata, 
        // オブジェクトのバージョン ID を指定します。
        SourceVersionId = versionid
    };
    // オブジェクトをコピーします。
    var result = client.CopyObject(req);
    Console.WriteLine("Copy object succeeded, vesionid:{0}", result.VersionId);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。*/
            
    /* Endpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Endpoint を https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
    std::string Endpoint = "yourEndpoint";
    /* Region をバケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、Region を cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* ソースバケットの名前を指定します。例:srcexamplebucket。*/
    std::string SourceBucketName = "srcexamplebucket";
    /* 宛先バケットの名前を指定します。ソースバケットと同じリージョンにある必要があります。例:destbucket。*/
    std::string CopyBucketName = "destbucket";
    /* ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:srcdir/scrobject.txt。*/
    std::string SourceObjectName = "srcdir/scrobject.txt";
    /* 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:destdir/destobject.txt。*/
    std::string CopyObjectName = "destdir/destobject.txt";


    /* ネットワークリソースを初期化します。*/
    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);

    CopyObjectRequest request(CopyBucketName, CopyObjectName);
    request.setCopySource(SourceBucketName, SourceObjectName);
    /* ソースオブジェクトのバージョン ID を指定します。*/
    request.setVersionId("yourSourceObjectVersionId");

    /* 指定されたバージョンのオブジェクトをコピーします。*/
    auto outcome = client.CopyObject(request);

    if (outcome.isSuccess()) {
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
        /* 例外を処理します。*/
        std::cout << "CopyObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースを解放します。*/
    ShutdownSdk();
    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 // オブジェクトが格納されているリージョン。
	srcBucketName  string // ソースバケットの名前。
	srcObjectName  string // ソースオブジェクトの名前。
	destBucketName string // 宛先バケットの名前。
	destObjectName string // 宛先オブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// ソースバケットの名前が指定されているかどうかを確認します。
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// リージョンが指定されているかどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 宛先バケットの名前が指定されていない場合、ソースバケットの名前が使用されます。
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// ソースオブジェクトの名前が指定されているかどうかを確認します。
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// 宛先オブジェクトの名前が指定されているかどうかを確認します。
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// デフォルトの構成をロードし、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// コピーリクエストを作成します。
	copyRequest := &oss.CopyObjectRequest{
		Bucket:           oss.Ptr(destBucketName),            // 宛先バケットの名前。
		Key:              oss.Ptr(destObjectName),            // 宛先オブジェクトの名前。
		SourceKey:        oss.Ptr(srcObjectName),             // ソースオブジェクトの名前。
		SourceBucket:     oss.Ptr(srcBucketName),             // ソースバケットの名前。
		SourceVersionId:  oss.Ptr("yourVersionId"),           // ソースオブジェクトの実際のバージョン ID を指定します。
		StorageClass:     oss.StorageClassStandard,           // ストレージクラスを標準に設定します。
		TaggingDirective: oss.Ptr("Replace"),                 // ソースオブジェクトのタグはコピーされません。
		Tagging:          oss.Ptr("tag1=value1&tag2=value2"), // 宛先オブジェクトの実際のタグを指定します。
	}

	// 操作を実行し、結果を処理します。
	copyResult, err := client.CopyObject(context.TODO(), copyRequest)
	if err != nil {
		log.Fatalf("failed to copy object: %v", err)
	}

	// 結果を表示します。
	log.Printf("copy object result versionId:%#v\n", *copyResult.VersionId)

}
<?php

// 依存関係をロードするために autoload ファイルをインクルードします。
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], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'The name of the bucket', 'required' => True], // (必須) 宛先バケットの名前を指定します。
    "key" => ['help' => 'The name of the object', 'required' => True], // (必須) 宛先オブジェクトの名前を指定します。
    "src-bucket" => ['help' => 'The name of the source bucket', 'required' => False], // (オプション) ソースバケットの名前を指定します。
    "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 = $options["bucket"]; // 宛先バケットの名前。
$key = $options["key"]; // 宛先オブジェクトの名前。
$srcKey = $options["src-key"]; // ソースオブジェクトの名前。

// 環境変数からアクセス認証情報を取得します。
// EnvironmentVariableCredentialsProvider 環境変数から AccessKey ID と AccessKey Secret を取得します。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合は、エンドポイントを指定します。
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// ソースオブジェクトをコピーするための CopyObjectRequest オブジェクトを作成します。
$request = new Oss\Models\CopyObjectRequest(
            bucket: $bucket,
            key: $key,
            sourceVersionId: "yourVersionId",// ソースオブジェクトのバージョン ID を指定します。
);

if (!empty($options["src-bucket"])) {
    $request->sourceBucket = $options["src-bucket"]; // ソースバケット名が提供されている場合は、sourceBucket パラメーターを指定します。
}
$request->sourceKey = $srcKey; // ソースオブジェクトの名前を指定します。

// オブジェクトコピー操作を実行します。
$result = $client->copyObject($request);

// オブジェクトコピーの結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。たとえば、HTTP ステータスコード 200 はリクエストが成功したことを示します。
    'request id:' . $result-> requestId. PHP_EOL // リクエスト ID。リクエストのデバッグまたは追跡に使用されます。
);
import argparse
import alibabacloud_oss_v2 as oss

# コマンドライン引数パーサーを作成し、スクリプトの目的を記述します:バケット内のオブジェクトをコピーする。
parser = argparse.ArgumentParser(description="copy object sample")

# 必須のリージョン、宛先バケット名、ソースバケット名、宛先オブジェクト名、ソースオブジェクト名、ソースオブジェクトバージョン ID、およびオプションのエンドポイントを含むコマンドライン引数を定義します。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the destination 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 destination object.', required=True)
parser.add_argument('--source_key', help='The name of the source object.', required=True)
parser.add_argument('--source_bucket', help='The name of the source bucket.', required=True)
parser.add_argument('--source_version_id', help='The version ID of the source object.',required=True)

def main():
    # コマンドライン引数を解析して、ユーザーが入力した値を取得します。
    args = parser.parse_args()

    # ID 検証のために環境変数からアクセス認証情報をロードします。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # デフォルトの SDK 構成を使用して構成オブジェクトを作成し、認証プロバイダーを設定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # コマンドライン引数に基づいて構成オブジェクトのリージョンプロパティを設定します。
    cfg.region = args.region

    # カスタムエンドポイントが提供されている場合は、構成オブジェクトのエンドポイントプロパティを更新します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 上記の構成を使用して OSS クライアントを初期化し、OSS との対話の準備をします。
    client = oss.Client(cfg)

    # 指定されたオブジェクトをコピーするリクエストを送信します。
    result = client.copy_object(oss.CopyObjectRequest(
        bucket=args.bucket,  # 宛先バケット名。
        key=args.key,  # 宛先オブジェクト名。
        source_key=args.source_key,  # ソースオブジェクト名。
        source_bucket=args.source_bucket,  # ソースバケット名。
        source_version_id=args.source_version_id,  # ソースオブジェクトのバージョン ID。
    ))

    # 操作結果に関する情報を出力して、リクエストのステータスを確認します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' version id: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' source version id: {result.source_version_id},'
          f' server side encryption: {result.server_side_encryption},'
          f' server side data encryption: {result.server_side_data_encryption},'
          f' last modified: {result.last_modified},'
          f' etag: {result.etag},'
          )

# このスクリプトが直接実行される場合、main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
    main()  # スクリプトのエントリポイント。プログラムフローはここから始まります。

ossutil の使用

ossutil を使用してバージョン管理が有効なバケットでオブジェクトの旧バージョンを現行バージョンとして復元する方法の詳細については、「revert」をご参照ください。

REST API の使用

プログラムでより多くのカスタムオプションが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するためのコードを手動で記述する必要があります。詳細については、「CopyObject」をご参照ください。