All Products
Search
Document Center

Object Storage Service:Operasi objek di bucket yang mengaktifkan versioning

Last Updated:Mar 01, 2026

Penimpaan atau penghapusan tidak sengaja dapat menyebabkan kehilangan data yang tidak dapat dikembalikan. Dengan versioning diaktifkan, Object Storage Service (OSS) menyimpan setiap versi dari tiap objek dalam bucket, sehingga Anda dapat menampilkan daftar, mengunduh, atau memulihkan versi sebelumnya kapan saja. OSS memberikan ID versi unik untuk setiap versi. Objek yang sudah ada beserta access control list (ACL)-nya tetap tidak berubah saat versioning diaktifkan.

ID versi objek apa pun yang diunggah sebelum versioning diaktifkan diatur ke null.

Untuk informasi selengkapnya, lihat Versioning.

Unggah objek

Saat Anda mengunggah objek ke bucket yang mengaktifkan versioning, OSS menghasilkan ID versi unik untuk objek tersebut. Jika Anda mengunggah objek dengan key yang sama seperti objek yang sudah ada, OSS menyimpan unggahan baru sebagai versi terkini dan mempertahankan unggahan sebelumnya sebagai versi sebelumnya.

OSS menghasilkan ID versi unik untuk setiap objek yang diunggah menggunakan operasi PutObject, PostObject, CopyObject, atau MultipartUpload.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi kiri, klik Buckets. Pada halaman Buckets, temukan dan klik bucket yang diinginkan.

  3. Pada pohon navigasi kiri, pilih Object Management > Objects.

  4. Pada halaman Objects, klik Upload Object.

  5. Pada halaman Upload Object, konfigurasikan parameter berikut.

    1. Konfigurasikan pengaturan dasar. | Parameter | Deskripsi | |-----------|-------------| | Upload To | Direktori tempat objek disimpan setelah diunggah. Current Directory: mengunggah objek ke direktori saat ini. Specified Directory: mengunggah objek ke direktori tertentu. Jika direktori belum ada, OSS akan membuatnya secara otomatis. Nama direktori harus terdiri dari 1 hingga 254 karakter, dikodekan dalam UTF-8, tidak boleh dimulai dengan / atau \, tidak boleh mengandung / berurutan, dan tidak boleh berupa ... | | Object ACL | ACL objek. Inherited from Bucket: menggunakan ACL yang sama dengan bucket. Private: hanya pemilik objek dan pengguna yang berwenang yang dapat membaca dan menulis objek. Public Read: semua pengguna dapat membaca objek. Public Read/Write: semua pengguna dapat membaca dan menulis objek. Untuk informasi selengkapnya, lihat Object ACLs. | | Files to Upload | Klik Select Files untuk memilih file atau Select Folders untuk memilih direktori. Anda juga dapat menyeret file ke bagian ini. Di bucket yang mengaktifkan versioning, mengunggah file dengan nama yang sama seperti objek yang sudah ada menjadikan objek tersebut sebagai versi sebelumnya. |

    2. Opsional: Klik ikon perluas di samping Advanced Settings untuk mengonfigurasi kelas penyimpanan, enkripsi, dan metadata. | Parameter | Deskripsi | |-----------|-------------| | Storage Class | Inherited from Bucket (default), Standard, IA (ukuran tagihan minimum: 64 KB, durasi penyimpanan minimum: 30 hari), Archive (ukuran tagihan minimum: 64 KB, durasi penyimpanan minimum: 60 hari, waktu pemulihan: sekitar 1 menit), Cold Archive (ukuran tagihan minimum: 64 KB, durasi penyimpanan minimum: 180 hari), atau Deep Cold Archive (ukuran tagihan minimum: 64 KB, durasi penyimpanan minimum: 180 hari). Untuk informasi selengkapnya, lihat Storage classes. | | Encryption Method | Inherited from Bucket (default), OSS-Managed (OSS mengelola kunci enkripsi), atau KMS (menggunakan customer master key (CMK) yang disimpan di Key Management Service). Untuk KMS, pilih CMK: alias/acs/oss (CMK default) atau alias/\<cmkname\> (CMK kustom). Hanya AES256 yang didukung. Untuk informasi selengkapnya, lihat Purchase a dedicated KMS instance. | | User-defined Metadata | Header metadata kustom dengan awalan x-oss-meta-. Ukuran total semua metadata yang ditentukan pengguna tidak boleh melebihi 8 KB. |

    3. Klik Upload Object.

Anda dapat melihat progres unggahan pada tab Upload Tasks di panel Task List.

Gunakan SDK OSS

Contoh berikut menunjukkan cara mengunggah objek ke bucket yang mengaktifkan versioning. Untuk SDK dalam bahasa lain, lihat Overview.

Java

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";
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String bucketName = "examplebucket";
        String region = "cn-hangzhou";

        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("nama kunci: " + ossVersion.getKey());
                    System.out.println("ID versi: " + ossVersion.getVersionId());
                    System.out.println("Apakah terbaru: " + ossVersion.isLatest());
                    System.out.println("Apakah penanda hapus: " + ossVersion.isDeleteMarker());
                }

                nextKeyMarker = versionListing.getNextKeyMarker();
                nextVersionMarker = versionListing.getNextVersionIdMarker();
            } while (versionListing.isTruncated());
        } catch (OSSException oe) {
            System.out.println("Menangkap OSSException, yang berarti permintaan Anda berhasil sampai ke OSS, "
                    + "tetapi ditolak dengan tanggapan error karena alasan tertentu.");
            System.out.println("Pesan Error:" + oe.getErrorMessage());
            System.out.println("Kode Error:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Menangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal yang serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Node.js

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

const client = new OSS({
  // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan Anda telah mengonfigurasi variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Tentukan nama 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']); // Tampilkan ID versi objek yang diunggah.
}
put();

Python

using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;

var endpoint = "yourEndpoint";
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var bucketName = "examplebucket";
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
const string region = "cn-hangzhou";

var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

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);
}

Go

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
)

func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

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)

	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)
	}

	log.Printf("put object result versionId:%#v\n", *result.VersionId)
}

C#

using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;

var endpoint = "yourEndpoint";
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var bucketName = "examplebucket";
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
const string region = "cn-hangzhou";

var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

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);
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    std::string Endpoint = "yourEndpoint";
    std::string Region = "yourRegion";
    std::string BucketName = "examplebucket";
    std::string ObjectName = "exampledir/exampleobject.txt";

    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    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;
}

PHP

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada', 'required' => True],
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS', 'required' => False],
    "bucket" => ['help' => 'Nama bucket', 'required' => True],
    "key" => ['help' => 'Nama objek', '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"];

$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

$client = new Oss\Client($cfg);

$data = 'Hello OSS';

$request = new Oss\Models\PutObjectRequest(
                bucket: $bucket,
                key: $key,
            );

$request->body = Oss\Utils::streamFor($data);

$result = $client->putObject($request);

printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL .
    'etag:' . $result->etag . PHP_EOL
);

Gunakan ossutil

Untuk informasi selengkapnya, lihat cp (upload files).

Gunakan RESTful API

Jika program Anda memerlukan opsi kustom yang lebih banyak, Anda dapat memanggil Operasi API RESTful. Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi selengkapnya, lihat PutObject.

Tampilkan daftar objek

Anda dapat memanggil operasi GetBucketVersions (ListObjectVersions) untuk menampilkan daftar semua versi objek di bucket yang mengaktifkan versioning, termasuk penanda hapus (delete markers).

  • Operasi GetBucket (ListObject) hanya mengembalikan versi objek terkini yang bukan penanda hapus.

  • Satu permintaan GetBucketVersions (ListObjectVersions) mengembalikan maksimal 1.000 versi objek. Untuk menampilkan semua versi, kirim beberapa permintaan.

  • Versi dikembalikan dalam urutan abjad berdasarkan key objek, lalu berdasarkan waktu pembuatan masing-masing versi.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi kiri, klik Buckets. Pada halaman Buckets, klik nama bucket yang diinginkan.

Halaman ini menampilkan versi terkini dari semua objek. Untuk melihat semua versi termasuk penanda hapus, klik Show di sebelah kanan Previous Versions pada halaman Objects.

Gunakan SDK OSS

Contoh berikut menunjukkan cara menampilkan daftar objek di bucket yang mengaktifkan versioning. Untuk SDK dalam bahasa lain, lihat Overview.

Java

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";
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String bucketName = "examplebucket";
        String region = "cn-hangzhou";

        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();
            }
        }
    }
}

Node.js

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

const client = new OSS({
  region: 'yourregion',
  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();

Python

import argparse
import alibabacloud_oss_v2 as oss

parser = argparse.ArgumentParser(description="list object versions sample")
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
parser.add_argument('--bucket', help='Nama bucket.', required=True)
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss.Client(cfg)

    paginator = client.list_object_versions_paginator()

    for page in paginator.iter_page(oss.ListObjectVersionsRequest(
            bucket=args.bucket,
        )
    ):
        for o in page.version:
            print(f'Object version: {o.key}, Size: {o.size}, Version_id: {o.version_id}, Last_modified: {o.last_modified}')


if __name__ == "__main__":
    main()

Gunakan ossutil

Untuk informasi selengkapnya, lihat ls (List resources under the account level).

Gunakan RESTful API

Jika program Anda memerlukan opsi kustom tambahan, Anda dapat memanggil operasi RESTful API. Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi selengkapnya, lihat ListObjectVersions (GetBucketVersions).

Unduh objek

Unduh versi terkini atau versi tertentu dari objek dari bucket yang mengaktifkan versioning.

Jenis permintaanPerilaku
GetObject tanpa ID versiMengembalikan versi terkini. Jika versi terkini adalah penanda hapus, mengembalikan 404 Not Found.
GetObject dengan version IDMengembalikan versi yang ditentukan.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi kiri, klik Buckets. Pada halaman Buckets, temukan dan klik bucket yang diinginkan.

  3. Pada pohon navigasi kiri, pilih Object Management > Objects.

  4. Pada halaman Objects, klik Show di sebelah kanan Previous Versions.

  5. Klik versi yang ingin diunduh. Pada panel yang muncul, klik Download di sebelah kanan Object URL.

Gunakan SDK OSS

Contoh berikut menunjukkan cara mengunduh objek dari bucket yang mengaktifkan versioning. Untuk SDK dalam bahasa lain, lihat Overview.

Node.js

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

const client = new OSS({
  region: 'yourregion',
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  bucket: 'yourbucketname'
});

async function get() {
  const result = await client.get('filename', {
      versionId: 'versionid',
  });
  console.log(result.content);
}
get();

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    std::string Endpoint = "yourEndpoint";
    std::string Region = "yourRegion";
    std::string BucketName = "examplebucket";
    std::string ObjectName = "exampledir/exampleobject.txt";

    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    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;
        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;
}

Python

import argparse
import alibabacloud_oss_v2 as oss

parser = argparse.ArgumentParser(description="get object sample")
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
parser.add_argument('--bucket', help='Nama bucket.', required=True)
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
parser.add_argument('--key', help='Nama objek.', required=True)
parser.add_argument('--version_id', help='ID versi objek.', required=True)

def main():
    args = parser.parse_args()

    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    client = oss.Client(cfg)

    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,
        key=args.key,
        version_id=args.version_id,
    ))

    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' version id: {result.version_id},'
    )

    content = result.body.read()
    with open('./test.txt', 'wb') as f:
        f.write(content)

    print(f'File berhasil disimpan ke test.txt!')

if __name__ == "__main__":
    main()

Go

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
)

func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

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)

	client := oss.NewClient(cfg)

	request := &oss.GetObjectRequest{
		Bucket:    oss.Ptr(bucketName),
		Key:       oss.Ptr(objectName),
		VersionId: oss.Ptr("yourVersionId"),
	}

	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

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True],
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False],
    "bucket" => ['help' => 'Nama bucket', 'required' => True],
    "key" => ['help' => 'Nama objek', '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" . PHP_EOL;
        exit(1);
    }
}

$region = $options["region"];
$bucket = $options["bucket"];
$key = $options["key"];

$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

$client = new Oss\Client($cfg);

$request = new Oss\Models\GetObjectRequest(
                bucket: $bucket,
                key: $key,
                versionId:"yourVersionId",
);

$result = $client->getObject($request);

$localFilePath = './test/file.txt';
file_put_contents($localFilePath, $result->body->getContents());

printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL
);

Gunakan ossutil

Untuk informasi selengkapnya, lihat Download objects.

Gunakan RESTful API

Jika program Anda memerlukan opsi kustom tambahan, Anda dapat memanggil operasi RESTful API. Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi selengkapnya, lihat GetObject.

Hapus objek

Menghapus objek di bucket yang mengaktifkan versioning bekerja berbeda tergantung pada apakah Anda menentukan ID versi:

Metode penghapusanPerilakuDapat dikembalikan?
Tanpa ID versi (soft delete)OSS menambahkan penanda hapus sebagai versi terkini yang baru. Semua versi yang ada dipertahankan.Ya. Hapus penanda hapus atau pulihkan versi sebelumnya.
Dengan ID versi (permanent delete)OSS menghapus permanen versi yang ditentukan.Tidak. Versi yang dihapus tidak dapat dipulihkan.
Penting
  • Secara default, jika Anda tidak menentukan ID versi dalam permintaan DeleteObject, versi terkini dan versi sebelumnya dari objek tidak dihapus.

  • Jangan aktifkan OSS-HDFS dan versioning untuk bucket secara bersamaan. Jika tidak, OSS-HDFS mungkin tidak berfungsi sebagaimana mestinya. Untuk mengatasi masalah ini, nonaktifkan sementara versioning dan konfigurasikan aturan lifecycle untuk menghapus penanda hapus. Untuk informasi selengkapnya, lihat How do I resolve the issue that occurs after I enable OSS-HDFS and versioning for a bucket?

Otomatisasi pembersihan versi dengan aturan lifecycle

Anda dapat mengonfigurasi aturan lifecycle untuk mengelola kedaluwarsa versi secara otomatis:

Elemen lifecyclePerilakuDapat dikembalikan?
ExpirationVersi terkini menjadi versi sebelumnya. Penanda hapus ditambahkan sebagai versi terkini yang baru.Ya. Versi sebelumnya masih ada.
NoncurrentVersionExpirationMenghapus permanen versi sebelumnya yang telah kedaluwarsa.Tidak. Versi yang dihapus tidak dapat dipulihkan.

Untuk informasi selengkapnya, lihat Configuration elements.

Gunakan Konsol OSS

Untuk mengurangi biaya penyimpanan, hapus versi sebelumnya yang tidak lagi Anda perlukan.

Peringatan

Anda tidak dapat memulihkan versi sebelumnya setelah dihapus permanen. Lakukan dengan hati-hati.

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi kiri, klik Buckets. Pada halaman Buckets, temukan dan klik bucket yang diinginkan.

  3. Pada pohon navigasi kiri, pilih Object Management > Objects.

  4. Pada halaman Objects, klik Show di sebelah kanan Previous Versions.

  5. Temukan versi sebelumnya yang akan dihapus: Untuk menghapus beberapa versi sebelumnya, pilih versi tersebut dan klik Permanently Delete di bawah daftar objek.

    • Jika versi sebelumnya adalah penanda hapus, klik Permanently Delete di kolom Actions.

    • Jika versi sebelumnya bukan penanda hapus, arahkan pointer ke ikon di kolom Actions dan klik Permanently Delete.

  6. Klik OK.

Anda juga dapat mengonfigurasi aturan lifecycle untuk menghapus versi sebelumnya secara berkala. Untuk informasi selengkapnya, lihat Lifecycle.

Gunakan SDK OSS

Contoh berikut menunjukkan cara menghapus versi tertentu dari objek. Untuk SDK dalam bahasa lain, lihat Overview.

Java

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";
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String bucketName = "examplebucket";
        String objectName = "exampledir/object";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        String region = "cn-hangzhou";

        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();
            }
        }
    }
}

Node.js

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

const client = new OSS({
  region: 'yourregion',
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  bucket: 'yourbucketname'
});

const versionId = "versionId";
const objectName = "exampleobject.txt";
async function deleteVersionObject() {
  const result = await client.delete(objectName, {
    versionId,
  });
  console.log(result);
}

deleteVersionObject();

C#

using Aliyun.OSS;
using Aliyun.OSS.Common;

var endpoint = "yourEndpoint";
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
var bucketName = "examplebucket";
var objectName = "exampledir/exampleobject.txt";
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
const string region = "cn-hangzhou";

var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    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);
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    std::string Endpoint = "yourEndpoint";
    std::string Region = "yourRegion";
    std::string BucketName = "examplebucket";
    std::string ObjectName = "exampledir/exampleobject.txt";

    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
    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;
}

Go

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
)

func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	flag.Parse()

	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket wajib diisi")
	}
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah wajib diisi")
	}
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek wajib diisi")
	}

	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	client := oss.NewClient(cfg)

	request := &oss.RestoreObjectRequest{
		Bucket:    oss.Ptr(bucketName),
		Key:       oss.Ptr(objectName),
		VersionId: oss.Ptr("yourVersionId"),
		RestoreRequest: &oss.RestoreRequest{
			Days: 3,
		},
	}

	result, err := client.RestoreObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal memulihkan objek %v", err)
	}

	log.Printf("hasil pemulihan objek:%#v\n", result)
}

PHP

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True],
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False],
    "bucket" => ['help' => 'Nama bucket', 'required' => True],
    "key" => ['help' => 'Nama objek', '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" . PHP_EOL;
        exit(1);
    }
}

$region = $options["region"];
$bucket = $options["bucket"];
$key = $options["key"];

$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

$client = new Oss\Client($cfg);

$request = new Oss\Models\DeleteObjectRequest(
            bucket: $bucket,
            key: $key,
            versionId:"yourversionid",
);

$result = $client->deleteObject($request);

printf(
    'status code:' . $result->statusCode . PHP_EOL .
    'request id:' . $result->requestId . PHP_EOL
);

Gunakan ossutil

Untuk informasi selengkapnya, lihat rm (delete).

Gunakan RESTful API

Jika program Anda memerlukan opsi kustom tambahan, Anda dapat memanggil operasi RESTful API. Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi selengkapnya, lihat DeleteObject.

Pulihkan objek

Saat versioning diaktifkan, semua versi objek dipertahankan. Anda dapat memulihkan versi sebelumnya sebagai versi terkini dengan salah satu metode berikut:

Metode pemulihanCara kerjaTingkat risiko
CopyObject (disarankan)Menyalin versi sebelumnya ke bucket yang sama. OSS menghasilkan ID versi baru untuk salinan tersebut, yang menjadi versi terkini. Semua versi yang ada dipertahankan.Rendah. Tidak ada data yang hilang.
DeleteObject dengan ID versiMenghapus permanen versi terkini. Versi sebelumnya yang paling baru menjadi versi terkini yang baru.Tinggi. Versi yang dihapus tidak dapat dipulihkan.
Penting

Gunakan CopyObject untuk pemulihan bila memungkinkan. DeleteObject menghapus permanen versi terkini, yang tidak dapat dipulihkan.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi kiri, klik Buckets. Pada halaman Buckets, temukan dan klik bucket yang diinginkan.

  3. Pada pohon navigasi kiri, pilih Object Management > Objects.

  4. Pada halaman Objects, klik Show di sebelah kanan Previous Versions.

  5. Pulihkan versi sebelumnya sebagai versi terkini.

    • Pulihkan satu versi: Klik Restore di kolom Actions pada versi sebelumnya yang dituju.

    • Pulihkan beberapa versi: Pilih versi yang akan dipulihkan dan klik Restore di bawah daftar objek. Pada pesan yang muncul, klik OK.

    Penting

    Anda hanya dapat memulihkan satu versi sebelumnya dalam satu waktu. Versi sebelumnya yang akan dipulihkan tidak boleh berupa penanda hapus.

Gunakan SDK OSS

Contoh berikut menunjukkan cara menyalin versi tertentu dari objek untuk memulihkannya. Untuk SDK dalam bahasa lain, lihat Overview.

Java

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";
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String sourceBucketName = "srcexamplebucket";
        String sourceObjectName = "srcexampleobject.txt";
        String destinationBucketName = "desexamplebucket";
        String destinationObjectName = "desexampleobject.txt";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        String region = "cn-hangzhou";

        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();
            }
        }
    }
}

Node.js

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

const client = new OSS({
  region: 'yourregion',
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  bucket: 'yourbucketname'
});

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

C#

using Aliyun.OSS;
using Aliyun.OSS.Common;

var endpoint = "yourEndpoint";
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";
var versionid = "yourArchiveObjectVersionid";
const string region = "cn-hangzhou";

var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4;

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 = metadata,
        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);
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    std::string Endpoint = "yourEndpoint";
    std::string Region = "yourRegion";
    std::string SourceBucketName = "srcexamplebucket";
    std::string CopyBucketName = "destbucket";
    std::string SourceObjectName = "srcdir/scrobject.txt";
    std::string CopyObjectName = "destdir/destobject.txt";

    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    CopyObjectRequest request(CopyBucketName, CopyObjectName);
    request.setCopySource(SourceBucketName, SourceObjectName);
    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;
}

Go

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
)

func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

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)

	client := oss.NewClient(cfg)

	request := &oss.RestoreObjectRequest{
		Bucket:    oss.Ptr(bucketName),
		Key:       oss.Ptr(objectName),
		VersionId: oss.Ptr("yourVersionId"),
		RestoreRequest: &oss.RestoreRequest{
			Days: 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)
}

Gunakan ossutil

Untuk informasi selengkapnya, lihat revert.

Gunakan RESTful API

Jika program Anda memerlukan opsi kustom tambahan, Anda dapat memanggil operasi RESTful API. Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi selengkapnya, lihat CopyObject.