全部产品
Search
文档中心

Object Storage Service:Kelola objek di bucket yang diaktifkan versioning-nya

更新时间:Dec 06, 2025

Saat Anda mengaktifkan versioning untuk suatu bucket, Object Storage Service (OSS) menghasilkan ID versi unik untuk setiap objek di dalam bucket tersebut. Konten dan access control list (ACL) objek yang sudah ada tetap tidak berubah. Versioning mencegah penimpaan atau penghapusan data secara tidak sengaja serta memungkinkan Anda melakukan kueri atau memulihkan versi sebelumnya dari objek.

Catatan

Perhatikan hal-hal berikut saat Anda mengunggah, menampilkan daftar, mengunduh, menghapus, dan memulihkan objek di bucket yang diaktifkan versioning-nya:

  • OSS menyimpan versi terkini dan nol atau lebih versi sebelumnya untuk setiap objek.

  • Jika Anda mengunggah objek sebelum mengaktifkan versioning, OSS menetapkan ID versi objek tersebut menjadi null.

  • Untuk kemudahan membaca, semua ID versi pada gambar dalam topik ini disederhanakan.

Untuk informasi selengkapnya, lihat Pengantar versioning.

Unggah objek

Saat Anda mengunggah objek ke bucket yang diaktifkan versioning-nya, OSS secara otomatis menambahkan ID versi unik ke objek tersebut.

Catatan

Operasi seperti PutObject, PostObject, CopyObject, dan MultipartUpload secara otomatis menambahkan ID versi unik ke versi objek baru.

Saat Anda mengunggah objek menggunakan operasi PUT, OSS memberikan ID versi unik (ID=111111) ke objek tersebut.

Saat Anda mengunggah kembali objek dengan nama yang sama (key=example.jpg), versi objek asli (ID=111111) menjadi versi sebelumnya. Versi baru (ID=222222) disimpan sebagai versi terkini. Jika Anda mengunggah objek tersebut sekali lagi, versi yang ada (ID=111111 dan ID=222222) menjadi versi sebelumnya, dan versi baru (ID=333333) disimpan sebagai versi terkini.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

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

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

  4. Pada halaman Objects, klik Upload Object.

  5. Pada panel Upload Object, konfigurasikan parameter-parameter berikut.

    1. Konfigurasikan opsi dasar.

      Parameter

      Deskripsi

      Upload To

      Tentukan path penyimpanan file setelah diunggah ke bucket tujuan.

      • Current Directory: Unggah file ke direktori saat ini.

      • Specified Directory: Unggah file ke direktori tertentu. Anda harus memasukkan nama direktori. Jika direktori tersebut belum ada, OSS akan membuatnya secara otomatis dan mengunggah file ke dalamnya.

        Ikuti konvensi penamaan berikut untuk direktori:

        • Gunakan karakter UTF-8. Nama harus terdiri dari 1 hingga 254 karakter.

        • Nama tidak boleh diawali dengan garis miring maju (/) atau garis miring terbalik (\).

        • Nama tidak boleh mengandung dua garis miring maju (/) berturut-turut.

        • Nama tidak boleh berupa .. .

      Object ACL

      Tentukan ACL untuk file.

      • Inherit From Bucket: ACL objek sama dengan bucket.

      • Private (Direkomendasikan): Hanya pemilik objek yang memiliki izin baca dan tulis pada objek tersebut. Pengguna lain tidak dapat mengakses objek tersebut.

      • Public Read: Pemilik objek memiliki izin baca dan tulis pada objek tersebut. Pengguna lain, termasuk pengguna anonim, dapat membaca objek tersebut. Hal ini dapat menyebabkan kebocoran data dan peningkatan biaya. Gunakan dengan hati-hati.

      • Public Read/Write: Setiap pengguna, termasuk pengguna anonim, dapat mengakses objek tersebut dan menulis data ke dalamnya. Hal ini dapat menyebabkan kebocoran data dan peningkatan biaya. Jika seseorang secara jahat menulis informasi ilegal, hak hukum Anda mungkin dilanggar. Kecuali benar-benar diperlukan, jangan berikan izin public-read-write kepada objek.

      Untuk informasi selengkapnya tentang ACL objek, lihat Object ACLs.

      Files to Upload

      Pilih file atau folder yang ingin diunggah.

      Anda dapat mengklik Select Files atau Select Folders untuk memilih file atau folder lokal. Anda juga dapat menyeret file atau folder target ke area Files To Upload.

      Jika folder yang akan diunggah berisi file yang tidak perlu diunggah, klik Remove pada kolom Actions untuk file tersebut guna menghapusnya dari daftar file.

      Penting
      • Saat Anda mengunggah file ke bucket yang tidak memiliki versioning yang diaktifkan, jika file yang diunggah memiliki nama yang sama dengan file yang sudah ada, file yang sudah ada akan ditimpa.

      • Saat Anda mengunggah file ke bucket yang memiliki versioning yang diaktifkan, jika file yang diunggah memiliki nama yang sama dengan file yang sudah ada, file yang diunggah menjadi versi terbaru dan file yang sudah ada menjadi versi sebelumnya.

    2. Opsional: Klik ikon image.png di sebelah kanan Advanced Options untuk mengatur opsi lanjutan seperti kelas penyimpanan file dan metode enkripsi.

      Parameter

      Deskripsi

      Storage Class

      Tentukan kelas penyimpanan untuk file. Nilai yang valid:

      • Inherit From Bucket (Default): Kelas penyimpanan objek sama dengan bucket.

      • Standard: Menawarkan penyimpanan objek yang sangat andal, tersedia, dan berkinerja tinggi yang mendukung akses data yang sering. Cocok untuk berbagai skenario, seperti media sosial, aplikasi berbagi citra dan video, situs web besar, dan analitik data besar. Penyimpanan Standard mendukung penyimpanan redundan zona (ZRS) dan penyimpanan redundan lokal (LRS).

      • Infrequent Access: Menawarkan penyimpanan objek yang tahan lama dengan biaya lebih rendah dibandingkan penyimpanan Standard. Memiliki ukuran tagihan minimum 64 KB dan durasi penyimpanan minimum 30 hari. Mendukung akses data real-time. Biaya pengambilan data dikenakan saat Anda mengakses data. Kelas penyimpanan ini cocok untuk skenario dengan frekuensi akses rendah, seperti satu hingga dua kali per bulan. Penyimpanan Infrequent Access mendukung ZRS dan LRS.

      • Archive Storage: Menawarkan penyimpanan objek yang tahan lama dengan biaya sangat rendah. Memiliki ukuran tagihan minimum 64 KB dan durasi penyimpanan minimum 60 hari. Data Archive Storage dapat diakses setelah dipulihkan (membutuhkan waktu sekitar 1 menit) atau diakses langsung. Biaya pengambilan data dikenakan untuk data yang dipulihkan. Biaya akses real-time untuk objek Archive dikenakan untuk akses langsung. Archive Storage cocok untuk skenario retensi data jangka panjang (LTR), seperti arsip, citra medis, data ilmiah, dan rekaman video. Archive Storage mendukung ZRS dan LRS.

      • Cold Archive: Menawarkan penyimpanan objek yang tahan lama dengan biaya lebih rendah dibandingkan Archive Storage. Memiliki ukuran tagihan minimum 64 KB dan durasi penyimpanan minimum 180 hari. Data harus dipulihkan sebelum dapat diakses. Waktu pemulihan tergantung pada ukuran data dan mode pemulihan yang dipilih. Biaya pengambilan data dan biaya permintaan dikenakan untuk pemulihan. Kelas penyimpanan ini cocok untuk data dingin yang perlu disimpan dalam periode sangat panjang, seperti data yang disimpan untuk kepatuhan, data mentah yang terakumulasi di bidang data besar dan artificial intelligence (AI), sumber daya media yang disimpan di industri film, dan video arsip di industri pendidikan online. Cold Archive hanya mendukung LRS.

      • Deep Cold Archive: Menawarkan penyimpanan objek yang tahan lama dengan biaya lebih rendah dibandingkan Cold Archive. Memiliki ukuran tagihan minimum 64 KB dan durasi penyimpanan minimum 180 hari. Data harus dipulihkan sebelum dapat diakses. Waktu pemulihan tergantung pada ukuran data dan mode pemulihan yang dipilih. Biaya pengambilan data dan biaya permintaan dikenakan untuk pemulihan. Kelas penyimpanan ini cocok untuk data sangat dingin yang perlu disimpan dalam periode sangat panjang, seperti retensi jangka panjang data mentah di bidang data besar dan AI, retensi jangka panjang data media, arsip regulasi dan kepatuhan, serta pengganti pita. Deep Cold Archive hanya mendukung LRS.

      Untuk informasi selengkapnya, lihat Kelas penyimpanan.

      Encryption Method

      Tentukan metode enkripsi sisi server untuk file. Nilai yang valid:

      • Inherited from Bucket (Default): Metode enkripsi sisi server objek sama dengan bucket.

      • OSS-Managed: Gunakan kunci yang dikelola oleh OSS untuk enkripsi. OSS menggunakan kunci yang berbeda untuk setiap objek. Sebagai lapisan perlindungan tambahan, OSS menggunakan kunci master untuk mengenkripsi kunci enkripsi itu sendiri.

      • KMS: Gunakan customer master key (CMK) default yang dikelola oleh KMS atau ID CMK tertentu untuk enkripsi dan dekripsi.

        Sebelum menggunakan enkripsi KMS, Anda harus mengaktifkan KMS. Untuk informasi selengkapnya, lihat Aktifkan KMS.

        Berikut ini adalah deskripsi Encryption Key untuk KMS:

        Format kunci enkripsi adalah <alias>(CMK ID). <alias> adalah alias CMK, dan CMK ID adalah ID CMK. Nilai yang valid:

        • alias/acs/oss(CMK ID): Gunakan CMK terkelola default untuk menghasilkan kunci berbeda guna mengenkripsi objek berbeda. Objek secara otomatis didekripsi saat diunduh.

        • alias/<cmkname>(CMK ID): Gunakan CMK tertentu untuk menghasilkan kunci berbeda guna mengenkripsi objek berbeda. ID CMK yang digunakan untuk mengenkripsi objek dicatat dalam metadata objek tersebut. Saat pengguna yang memiliki izin dekripsi mengunduh objek, objek tersebut secara otomatis didekripsi. <cmkname> adalah pengenal opsional untuk kunci master yang dikonfigurasi saat Anda membuat kunci tersebut.

          Sebelum menggunakan ID CMK tertentu, Anda harus membuat kunci reguler atau kunci eksternal di wilayah yang sama dengan bucket di Konsol KMS. Untuk informasi selengkapnya, lihat Buat CMK.

      • Encryption Algorithm: Hanya algoritma enkripsi AES256 yang didukung.

      User-defined Metadata

      Digunakan untuk menambahkan informasi deskriptif ke objek. Anda dapat menambahkan beberapa metadata yang ditentukan pengguna (User Meta), tetapi ukuran totalnya tidak boleh melebihi 8 KB. Saat menambahkan metadata yang ditentukan pengguna, parameter harus diawali dengan awalan x-oss-meta- dan diberi nilai, misalnya, x-oss-meta-location:hangzhou.

    3. Klik Upload Object.

      Anda kemudian dapat melihat progres unggah setiap file pada tab Upload Tasks di panel Tasks.

Gunakan SDK Alibaba Cloud

Kode contoh berikut menunjukkan cara melakukan unggahan sederhana ke bucket yang diaktifkan versioning-nya menggunakan SDK umum. Untuk informasi tentang penggunaan SDK lainnya, lihat 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 {
        // Endpoint untuk wilayah China (Hangzhou) digunakan sebagai contoh. Gantilah dengan Endpoint yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "examplebucket";
        // Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/object";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Region ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Saat instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Contoh berikut menunjukkan cara mengunggah string.
            String content = "Hello OSS";
            PutObjectResult result = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            // Lihat ID versi objek yang diunggah.
            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({
  // Atur region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Atur bucket ke nama bucket Anda.
  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']); // Lihat ID versi objek yang diunggah.
}
put();
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;

// Atur yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Atur bucketName ke nama bucket, misalnya examplebucket.
var bucketName = "examplebucket";
// Atur objectName ke path lengkap objek. Path lengkap tidak boleh mencakup nama bucket. Misalnya, exampledir/exampleobject.txt.
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// Atur region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instance ClientConfiguration dan ubah parameter default sesuai kebutuhan.
var conf = new ClientConfiguration();

// Gunakan Signature Version 4.
conf.SignatureVersion = SignatureVersion.V4;

// Buat instance OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    // Unggah objek.
    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)
{
    /* Inisialisasi informasi akun OSS. */
            
    /* Atur yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket. Contoh: examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan path lengkap Object. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt. */
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* Inisialisasi sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    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);

    /* Unggah file. */
    auto outcome = client.PutObject(request);

    if (outcome.isSuccess()) {
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
        /* Tangani pengecualian. */
        std::cout << "PutObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya jaringan. */
    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"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Definisikan fungsi init yang digunakan untuk menginisialisasi parameter.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// Tentukan konten yang ingin diunggah.
	content := "hi oss"

	// Muat konfigurasi default dan tentukan penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan untuk mengunggah objek.
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName),        // Nama bucket.
		Key: oss.Ptr(objectName),        // Nama objek.
		Body:   strings.NewReader(content), // Konten yang ingin diunggah.
	}

	// Jalankan permintaan untuk mengunggah objek.
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put object %v", err)
	}

	// Tampilkan ID versi objek.
	log.Printf("put object result versionId:%#v\n", *result.VersionId)
}
import argparse
import requests
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah.
parser = argparse.ArgumentParser(description="put object sample")
# Konfigurasikan argumen baris perintah --region untuk menentukan wilayah tempat bucket berada. Argumen ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Konfigurasikan argumen baris perintah --bucket untuk menentukan nama bucket. Argumen ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Konfigurasikan argumen baris perintah --endpoint untuk menentukan endpoint yang dapat digunakan layanan lain untuk mengakses OSS. Argumen ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Konfigurasikan argumen baris perintah --key untuk menentukan nama objek. Argumen ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    args = parser.parse_args()  # Parsing argumen baris perintah.

    # Dapatkan kredensial akses dari variabel lingkungan untuk autentikasi.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Dapatkan konfigurasi default SDK dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # Tentukan wilayah tempat bucket berada.
    cfg.region = args.region
    # Jika parameter endpoint disediakan, tentukan endpoint tersebut.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi untuk membuat instance OSSClient.
    client = oss.Client(cfg)

    # Unggah file lokal.
    local_file_path = '/yourLocalFilePath/yourFileName'
    with open(local_file_path, 'rb') as file:
        data = file.read()

    # Jalankan permintaan untuk mengunggah objek, dan tentukan nama bucket, nama objek, dan konten data.
    result = client.put_object(oss.PutObjectRequest(
        bucket=args.bucket,
        key=args.key,
        body=data,
    ))

    # Tampilkan kode status HTTP dalam respons, ID permintaan, dan hash MD5, ETag, nilai CRC-64, serta ID versi objek untuk memeriksa apakah permintaan berhasil.
    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()  # Titik masuk skrip. Panggil fungsi main() saat skrip dijalankan langsung.
<?php

// Sertakan file autoload untuk memuat dependensi.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Jelaskan parameter baris perintah.
$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada', 'required' => True], // (Wajib) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS', 'required' => False], // (Opsional) Tentukan endpoint OSS.
    "bucket" => ['help' => 'Nama bucket', 'required' => True], // (Wajib) Tentukan nama bucket.
    "key" => ['help' => 'Nama objek', 'required' => True], // (Wajib) Tentukan nama objek.
];

// Hasilkan daftar opsi panjang untuk mengurai parameter baris perintah.
$longopts = \array_map(function ($key) {
    return "$key:"; // Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
}, array_keys($optsdesc));

// Uraikan parameter baris perintah.
$options = getopt("", $longopts);

// Periksa apakah parameter wajib hilang.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // Tampilkan parameter wajib yang hilang.
        exit(1);
    }
}

// Dapatkan nilai parameter baris perintah dan tetapkan ke variabel.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Muat ID AccessKey dan rahasia AccessKey dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();

// Tentukan penyedia kredensial.
$cfg->setCredentialsProvider($credentialsProvider);

// Tentukan wilayah.
$cfg->setRegion($region);

// Jika endpoint disediakan, tentukan endpoint tersebut.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Tentukan data yang ingin diunggah.
$data = 'Hello OSS';

// Buat permintaan unggahan sederhana.
$request = new Oss\Models\PutObjectRequest(
                bucket: $bucket,
                key: $key,
            );

// Atur isi permintaan ke aliran data.
$request->body = Oss\Utils::streamFor($data);

// Gunakan metode putObject untuk mengunggah data.
$result = $client->putObject($request);

// Tampilkan hasil yang dikembalikan.
printf(
    'status code:' . $result->statusCode . PHP_EOL . // Kode status HTTP.
    'request id:' . $result->requestId . PHP_EOL . // ID permintaan.
    'etag:' . $result->etag . PHP_EOL // ETag objek.
);

Gunakan ossutil

Untuk informasi selengkapnya tentang cara melakukan unggahan sederhana ke bucket yang diaktifkan versioning-nya menggunakan ossutil, lihat cp (upload files).

Gunakan REST API

Jika program Anda memerlukan opsi kustom lebih lanjut, Anda dapat mengirim permintaan REST API secara langsung. Hal ini mengharuskan Anda menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya, lihat PutObject.

Tampilkan daftar objek

Di bucket yang diaktifkan versioning-nya, Anda dapat menggunakan operasi GetBucketVersions (ListObjectVersions) untuk mengambil informasi tentang semua versi objek, termasuk penanda hapus.

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

  • Permintaan GetBucketVersions (ListObjectVersions) tunggal dapat mengembalikan maksimal 1.000 versi objek. Anda dapat mengirim beberapa permintaan untuk mengambil semua versi objek.

    Misalnya, jika sebuah bucket berisi dua kunci (seperti example.jpg dan photo.jpg), example.jpg memiliki 900 versi, dan photo.jpg memiliki 500 versi, permintaan tunggal akan menampilkan 900 versi example.jpg dan 100 versi photo.jpg dalam urutan alfabetis dan versi.

Seperti yang ditunjukkan pada gambar berikut, saat Anda memanggil operasi GetBucketVersions (ListObjectVersions) di bucket yang diaktifkan versioning-nya, semua versi semua objek di bucket dikembalikan, termasuk objek yang versi terkininya adalah penanda hapus. Saat Anda memanggil operasi GetBucket (ListObject), hanya versi terkini objek yang dikembalikan, dan versi terkini tersebut tidak boleh berupa penanda hapus. Misalnya, objek yang ditunjukkan pada gambar tidak dikembalikan oleh panggilan GetBucket (ListObject) karena versi terkininya adalah penanda hapus.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

  2. Pada panel navigasi sebelah kiri, klik Buckets. Pada halaman Buckets, klik nama bucket target.

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

Gunakan SDK Alibaba Cloud

Kode contoh berikut menunjukkan cara menampilkan daftar objek di bucket yang diaktifkan versioning-nya menggunakan SDK umum. Untuk informasi tentang cara menampilkan daftar objek menggunakan SDK lainnya, lihat 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 {
        // Tetapkan endpoint. Contoh ini menggunakan endpoint publik wilayah China (Hangzhou). Tentukan endpoint yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "examplebucket";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Saat instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Tampilkan daftar versi semua objek, termasuk penanda hapus.
            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({
  // Atur region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Tentukan nama bucket.
  bucket: 'yourbucketname'
});

// Tampilkan informasi versi semua objek, termasuk penanda hapus.
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

# Buat parser argumen baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="list object versions sample")

# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket. Parameter ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan endpoint wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')

def main():
    # Parsing argumen baris perintah untuk mendapatkan nilai yang ditentukan.
    args = parser.parse_args()

    # Dari variabel lingkungan, muat informasi autentikasi yang diperlukan untuk mengakses OSS.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Gunakan konfigurasi default untuk membuat objek cfg dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # Jika endpoint kustom disediakan, perbarui atribut endpoint objek cfg dengan endpoint yang disediakan.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan pengaturan sebelumnya untuk menginisialisasi instance OSSClient.
    client = oss.Client(cfg)

    # Buat objek Paginator yang digunakan untuk menampilkan daftar versi objek per halaman.
    paginator = client.list_object_versions_paginator()

    # Iterasi melalui halaman.
    for page in paginator.iter_page(oss.ListObjectVersionsRequest(
            bucket=args.bucket,  # Nama bucket.
        )
    ):
        # Iterasi melalui versi objek pada halaman saat ini.
        for o in page.version:
            # Cetak informasi berikut tentang setiap versi objek:
            # - key: kunci objek.
            # - size: ukuran objek (byte).
            # - version_id: ID versi.
            # - last_modified: waktu modifikasi terakhir.
            print(f'Object version: {o.key}, Size: {o.size}, Version_id: {o.version_id}, Last_modified: {o.last_modified}')


# Panggil fungsi main untuk memulai logika pemrosesan saat skrip dijalankan langsung.
if __name__ == "__main__":
    main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.

Gunakan ossutil

Untuk informasi selengkapnya tentang cara menampilkan daftar objek di bucket yang diaktifkan versioning-nya, lihat ls (list resources).

Gunakan REST API

Jika program Anda memerlukan opsi kustom lebih lanjut, Anda dapat mengirim permintaan REST API secara langsung. Hal ini mengharuskan Anda menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya, lihat ListObjectVersions (GetBucketVersions).

Unduh objek

Anda dapat mengunduh versi terkini atau versi tertentu objek dari bucket yang diaktifkan versioning-nya.

Saat Anda mengunduh objek dengan permintaan GET tanpa menentukan ID versi, versi terkini (ID=333333) dikembalikan.

Jika versi terkini adalah penanda hapus, OSS mengembalikan 404 Not Found saat Anda mengirim permintaan GET.

Saat Anda mengunduh objek dengan permintaan GET, Anda dapat menentukan ID versi untuk mengambil versi tertentu (ID=222222).

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

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

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

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

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

Gunakan SDK Alibaba Cloud

Kode contoh berikut menunjukkan cara mengunduh objek dari bucket yang diaktifkan versioning-nya menggunakan SDK umum. Untuk informasi tentang cara mengunduh objek menggunakan SDK lainnya, lihat SDK.

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

const client = new OSS({
  // Atur yourregion ke wilayah tempat bucket berada. Misalnya, untuk wilayah China (Hangzhou), atur Region ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Atur yourbucketname ke nama bucket.
  bucket: 'yourbucketname'
});

async function get() {
  // Nama file.
  const result = await client.get('filename', {    
      // ID versi file yang akan diunduh.
      versionId: 'versionid',
  });
  console.log(result.content);
}
get();
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* Inisialisasi informasi akun OSS. */
            
    /* Atur yourEndpoint ke Endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Region ke cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket, seperti examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket, seperti exampledir/exampleobject.txt. */
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* Inisialisasi sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    /* Unduh file ke memori lokal. */
    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;
        /* Baca konten objek yang diunduh. */
        std::string content;
        *(outcome.result().Content()) >> content;
        std::cout << "getObjectToBuffer" << "content:" << content << std::endl;
        /* Lihat ID versi objek yang diunduh. */
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
            /* Tangani pengecualian. */
            std::cout << "getObjectToBuffer fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya jaringan. */
    ShutdownSdk();
    return 0;
}
import argparse
import alibabacloud_oss_v2 as oss

# Buat parser parameter baris perintah
parser = argparse.ArgumentParser(description="get object sample")

# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket, yang menentukan nama bucket. Parameter baris perintah ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan endpoint wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key, yang menentukan nama objek. Parameter baris perintah ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)
# Tentukan parameter --version_id, yang menentukan ID versi objek sumber. Parameter baris perintah ini wajib.
parser.add_argument('--version_id', help='ID versi objek.', required=True)

def main():
    # Parsing parameter baris perintah.
    args = parser.parse_args()

    # Dapatkan kredensial akses dari variabel lingkungan untuk autentikasi.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Muat konfigurasi default SDK dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # Tentukan wilayah tempat bucket berada.
    cfg.region = args.region

    # Jika parameter endpoint disediakan, tentukan endpoint tersebut.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi untuk membuat instance OSSClient.
    client = oss.Client(cfg)

    # Jalankan permintaan untuk mengunduh objek, dan tentukan nama bucket dan nama objek.
    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,  # Tentukan nama bucket.
        key=args.key,  # Tentukan nama objek.
        version_id=args.version_id, # Tentukan ID versi.
    ))

    # Tampilkan respons untuk memeriksa apakah permintaan berhasil.
    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},'
    )

    # Baca konten objek.
    content = result.body.read()

    # Simpan konten ke file lokal. Dalam contoh ini, file lokal diberi nama test.txt.
    with open('./test.txt', 'wb') as f:
        f.write(content)

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

# Panggil fungsi main saat skrip dijalankan langsung.
if __name__ == "__main__":
    main()  # Tentukan titik masuk dalam fungsi main skrip saat skrip dijalankan langsung.
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"
)

// Definisikan variabel global.
var (
	region     string // Wilayah tempat bucket Anda berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket telah ditentukan.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// Periksa apakah wilayah telah ditentukan.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Periksa apakah nama objek telah ditentukan.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// Tentukan path file output.
	outputFile := "downloaded.file" // Ganti parameter ini dengan path tempat Anda ingin menyimpan file.

	// Muat konfigurasi default dan tentukan penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan kueri.
	request := &oss.GetObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // Nama bucket
		Key:       oss.Ptr(objectName),      // Nama objek
		VersionId: oss.Ptr("yourVersionId"), // ID versi objek
	}

	// Lakukan operasi kueri dan proses hasilnya.
	result, err := client.GetObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to get object %v", err)
	}
	defer result.Body.Close() // Pastikan isi respons ditutup saat fungsi selesai.

	// Baca seluruh file.
	data, err := io.ReadAll(result.Body)
	if err != nil {
		log.Fatalf("failed to read object %v", err)
	}

	// Tulis konten ke file.
	err = os.WriteFile(outputFile, data, 0644)
	if err != nil {
		log.Fatalf("failed to write to output file %v", err)
	}

	log.Printf("file berhasil diunduh ke %s", outputFile)
}
<?php

// Perkenalkan file autoload untuk memuat pustaka dependensi.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Tentukan deskripsi untuk argumen baris perintah.
$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // (Wajib) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // (Opsional) Tentukan endpoint yang dapat digunakan layanan lain untuk mengakses OSS.
    "bucket" => ['help' => 'Nama bucket', 'required' => True], // (Wajib) Tentukan nama bucket.
    "key" => ['help' => 'Nama objek', 'required' => True], // (Wajib) Tentukan nama objek.
];

// Ubah deskripsi menjadi daftar opsi panjang yang diperlukan oleh getopt.
// Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parsing argumen baris perintah.
$options = getopt("", $longopts);

// Periksa apakah parameter wajib dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan untuk parameter.
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // Keluar dari program jika parameter wajib tidak dikonfigurasi.
    }
}

// Dapatkan nilai dari parameter yang diuraikan.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Muat kredensial akses dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk mengambil ID AccessKey dan rahasia AccessKey dari variabel lingkungan.    
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Tentukan penyedia kredensial.
$cfg->setRegion($region); // Tentukan wilayah tempat bucket berada.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // Tentukan endpoint jika disediakan.
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Buat objek GetObjectRequest untuk mendapatkan konten objek tertentu.
$request = new Oss\Models\GetObjectRequest(
                bucket: $bucket,
                key: $key,
                versionId:"yourVersionId",// Tentukan ID versi objek.
);

// Kueri objek.
$result = $client->getObject($request);

// Tentukan path lokal untuk menyimpan objek.
$localFilePath = './test/file.txt'; // Ganti parameter ini dengan path file lokal yang sebenarnya.

// Tulis konten ke file lokal.
file_put_contents($localFilePath, $result->body->getContents());

// Tampilkan hasilnya.
// Keluarkan kode status HTTP, ID permintaan, dan konten objek.
printf(
    'status code:' . $result->statusCode . PHP_EOL . // Kode status HTTP. Misalnya, kode status HTTP 200 menunjukkan bahwa permintaan berhasil.
    'request id:' . $result-> requestId. PHP_EOL // ID permintaan, yang digunakan untuk debug atau melacak permintaan.
);

Gunakan ossutil

Untuk informasi selengkapnya tentang cara mengunduh objek dari bucket yang diaktifkan versioning-nya menggunakan ossutil, lihat cp (download file).

Gunakan REST API

Jika program Anda memerlukan opsi kustom lebih lanjut, Anda dapat mengirim permintaan REST API secara langsung. Hal ini mengharuskan Anda menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya, lihat GetObject.

Hapus objek

Setelah Anda mengaktifkan versioning, Anda dapat menghapus objek secara permanen dengan menentukan ID versinya atau dengan mengonfigurasi aturan siklus hidup. Jika Anda menghapus objek tanpa menentukan ID versi, penanda hapus dimasukkan ke dalam bucket sebagai versi terkini.

Penting
  • Setelah Anda mengaktifkan versioning, jika Anda menghapus objek tanpa menentukan ID versi, versi terkini dan versi sebelumnya objek tersebut tidak dihapus secara default.

  • Jangan aktifkan OSS-HDFS dan versioning untuk bucket secara bersamaan. Jika tidak, OSS-HDFS mungkin tidak berfungsi sebagaimana mestinya. Untuk memastikan stabilitas OSS-HDFS, Anda perlu menangguhkan versioning sesegera mungkin dan mengonfigurasi aturan siklus hidup untuk menghapus penanda hapus.

    Untuk informasi selengkapnya, lihat Bagaimana cara menangani bucket yang diaktifkan layanan OSS-HDFS dan versioning-nya?.

Anda juga dapat menentukan elemen Expiration dalam aturan siklus hidup untuk mengakhiri versi terkini objek, atau menggunakan elemen NoncurrentVersionExpiration untuk menghapus permanen versi objek non-terkini. Rinciannya sebagai berikut:

  • Expiration: Berlaku untuk versi objek terkini. Saat objek kedaluwarsa, OSS menambahkan penanda hapus untuk objek tersebut. Hal ini menjadikan penanda hapus sebagai versi terkini baru dan objek yang kedaluwarsa menjadi versi non-terkini.

  • NoncurrentVersionExpiration: Berlaku untuk versi objek non-terkini. Menghapus permanen versi objek tersebut.

Untuk informasi selengkapnya tentang penggunaan versioning dengan aturan siklus hidup, lihat Elemen konfigurasi siklus hidup.

Perilaku operasi DELETE bergantung pada apakah Anda menentukan ID versi.

  • Jika Anda tidak menentukan ID versi objek, OSS memasukkan penanda hapus sebagai versi terkini. Penanda hapus memiliki ID versi unik tetapi tidak memiliki data atau ACL terkait. Gambar berikut menunjukkan contoh di mana versi terkini adalah penanda hapus dengan ID versi=444444.

  • Jika Anda menentukan ID versi objek, versi objek tersebut dihapus secara permanen. Gambar berikut menunjukkan contoh di mana versi objek dengan ID=333333 dihapus.

Gunakan Konsol OSS

Untuk meminimalkan biaya penyimpanan, kami menyarankan agar Anda menghapus versi sebelumnya objek yang tidak lagi Anda perlukan sesegera mungkin.

Peringatan

Versi objek sebelumnya tidak dapat dipulihkan setelah dihapus. Gunakan dengan hati-hati.

  1. Masuk ke Konsol OSS.

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

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

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

  5. Temukan versi objek sebelumnya yang tidak lagi Anda perlukan dan hapus sebagai berikut:

    • Jika versi objek sebelumnya yang ingin Anda hapus adalah penanda hapus, klik Permanently Delete pada kolom Actions.

    • Jika versi sebelumnya objek yang ingin Anda hapus bukan penanda hapus, arahkan pointer ke ikon image.png pada kolom Actions dan klik Permanently Delete.

    Anda juga dapat memilih beberapa versi sebelumnya untuk menghapusnya secara batch, lalu klik Permanently Delete di bagian bawah halaman.

  6. Klik OK.

    Anda juga dapat mengonfigurasi aturan siklus hidup untuk menghapus versi objek sebelumnya secara otomatis dan berkala. Untuk informasi selengkapnya, lihat Pengantar aturan siklus hidup.

Gunakan SDK Alibaba Cloud

Kode contoh berikut menunjukkan cara menghapus versi tertentu file dari bucket yang diaktifkan versioning-nya menggunakan SDK umum. Untuk informasi tentang cara menghapus versi tertentu file menggunakan SDK lainnya, lihat 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 {
        // Wilayah China (Hangzhou) digunakan sebagai contoh. Tentukan wilayah dan endpoint yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Atur nama bucket, misalnya examplebucket.
        String bucketName = "examplebucket";
        // Atur path lengkap objek. Path lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampledir/object";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        // Atur wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber dayanya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Hapus versi objek yang ditentukan.
            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({
  // Ganti yourregion dengan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Region ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Ganti yourbucketname dengan nama bucket.
  bucket: 'yourbucketname'
});

// Tentukan versionId objek.
const versionId = "versionId";
// Tentukan objek.
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;

// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. 
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket. Contoh: examplebucket. 
var bucketName = "examplebucket";
// Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt. 
var objectName = "exampledir/exampleobject.txt";
// Tentukan ID versi objek atau penanda hapus. 
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instance ClientConfiguration dan ubah parameter default sesuai kebutuhan Anda.
var conf = new ClientConfiguration();

// Gunakan algoritma signature V4.
conf.SignatureVersion = SignatureVersion.V4;

// Buat instance OSSClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
    // Tentukan ID versi objek atau penanda hapus yang ingin dihapus. 
    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)
{
    /* Inisialisasi informasi akun OSS. */
            
    /* Atur yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Atur yourRegion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket, misalnya examplebucket. */
    std::string BucketName = "examplebucket";
    /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* Inisialisasi sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    /* Hapus objek dengan versionId tertentu atau objek yang terkait dengan penanda hapus yang memiliki versionId tertentu. */
    auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
    /* Jika versionId objek ditentukan, delete_marker yang dikembalikan adalah None dan versionId yang dikembalikan adalah versionId objek yang ditentukan. */
    /* Jika versionId penanda hapus ditentukan, delete_marker yang dikembalikan adalah True dan versionId yang dikembalikan adalah versionId penanda hapus yang ditentukan. */
    if (!outcome.isSuccess()) {
        /* Tangani pengecualian. */
        std::cout << "DeleteObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya jaringan. */
    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"
)

// Definisikan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket telah ditentukan.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// Periksa apakah wilayah telah ditentukan.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Periksa apakah nama objek telah ditentukan.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan untuk menghapus objek.
	request := &oss.DeleteObjectRequest{
		Bucket:    oss.Ptr(bucketName),      // Nama bucket.
		Key:       oss.Ptr(objectName),      // Nama objek.
		VersionId: oss.Ptr("yourVersionId"), // ID versi objek.
	}

	// Hapus objek dan proses hasilnya.
	result, err := client.DeleteObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to delete object %v", err)
	}

	// Tampilkan hasil penghapusan.
	log.Printf("delete object result:%#v\n", result)
}
<?php

// Impor file autoloader untuk memastikan pustaka dependensi dimuat dengan benar.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Definisikan deskripsi argumen baris perintah.
$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. Parameter ini wajib.
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Endpoint. Parameter ini opsional.
    "bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. Parameter ini wajib.
    "key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. Parameter ini wajib.
];

// Ubah deskripsi argumen menjadi format opsi panjang yang diperlukan oleh getopt.
// Tambahkan titik dua (:) setelah setiap argumen untuk menunjukkan bahwa argumen memerlukan nilai.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parsing argumen baris perintah.
$options = getopt("", $longopts);

// Verifikasi bahwa semua argumen wajib ditentukan.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan argumen.
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // Jika argumen wajib hilang, keluar dari program.
    }
}

// Ambil nilai dari argumen yang diuraikan.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"];       // Nama objek.

// Muat kredensial dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk membaca ID Access Key dan Rahasia Access Key dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Atur penyedia kredensial.
$cfg->setRegion($region); // Atur wilayah tempat bucket berada.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // Jika endpoint disediakan, atur endpoint tersebut.
}

// Buat instance klien OSS.
$client = new Oss\Client($cfg);

// Buat objek DeleteObjectRequest untuk menghapus objek tertentu.
$request = new Oss\Models\DeleteObjectRequest(
            bucket: $bucket,
            key: $key,
            versionId:"yourversionid", // Tentukan nomor versi objek yang akan dihapus.
);

// Jalankan operasi hapus objek.
$result = $client->deleteObject($request);

// Cetak hasil penghapusan.
// Keluarkan kode status HTTP dan ID permintaan untuk memverifikasi apakah penghapusan berhasil.
printf(
    'status code:' . $result->statusCode . PHP_EOL . // Kode status HTTP. Misalnya, 204 menunjukkan bahwa penghapusan berhasil.
    'request id:' . $result->requestId . PHP_EOL     // ID permintaan, yang digunakan untuk debug atau melacak permintaan.
);

Gunakan ossutil

Untuk informasi selengkapnya tentang cara menghapus objek dari bucket yang diaktifkan versioning-nya menggunakan ossutil, lihat rm (delete).

Gunakan REST API

Jika program Anda memerlukan opsi kustom lebih lanjut, Anda dapat mengirim permintaan REST API secara langsung. Hal ini mengharuskan Anda menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya, lihat DeleteObject.

Pulihkan objek

Saat Anda mengaktifkan versioning, semua versi objek di bucket dipertahankan. Anda dapat memulihkan versi sebelumnya tertentu objek untuk menjadikannya versi terkini.

Anda dapat memulihkan versi sebelumnya objek dengan salah satu dari dua cara berikut:

  • Gunakan CopyObject untuk memulihkan versi sebelumnya objek

    Objek yang disalin menjadi versi terkini objek, dan semua versi objek dipertahankan.

    Seperti yang ditunjukkan pada gambar berikut, versi sebelumnya objek asli (ID=222222) disalin ke bucket yang sama. OSS menghasilkan versi baru untuk objek tersebut (ID=444444) dan menetapkannya sebagai versi terkini. Oleh karena itu, objek memiliki versi sebelumnya (ID=222222) dan versi terkini (ID=444444).

  • Hapus versi terkini objek untuk memulihkan versi sebelumnya

    Seperti yang ditunjukkan pada gambar berikut, saat Anda menghapus permanen versi objek terkini (ID=222222) dengan menentukan ID versinya dalam permintaan DELETE, versi sebelumnya berikutnya (ID=111111) menjadi versi terkini objek.

Penting

Karena versi terkini objek tidak dapat dipulihkan setelah dihapus, kami menyarankan agar Anda menggunakan CopyObject untuk memulihkan versi sebelumnya objek.

Gunakan Konsol OSS

  1. Masuk ke Konsol OSS.

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

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

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

  5. Pulihkan versi sebelumnya tertentu objek ke versi terkini.

    Penting

    Anda hanya dapat memulihkan satu versi sebelumnya objek dalam satu waktu. Versi sebelumnya yang ingin Anda pulihkan tidak boleh berupa penanda hapus.

    • Pulihkan satu objek

      Klik Restore pada kolom Actions versi sebelumnya target.

    • Pulihkan beberapa objek

      Pilih versi sebelumnya target, klik Restore di bagian bawah halaman, lalu klik OK pada kotak dialog yang muncul.

Gunakan SDK Alibaba Cloud

Kode contoh berikut menunjukkan cara menyalin versi tertentu file dari bucket yang diaktifkan versioning-nya menggunakan SDK umum. Untuk informasi tentang cara menyalin versi tertentu file menggunakan SDK lainnya, lihat 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 {
        // Dalam contoh ini, endpoint untuk wilayah China (Hangzhou) digunakan. Tentukan endpoint yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket sumber.
        String sourceBucketName = "srcexamplebucket";
        // Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap.
        String sourceObjectName = "srcexampleobject.txt";
        // Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber.
        String destinationBucketName = "desexamplebucket";
        // Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap.
        String destinationObjectName = "desexampleobject.txt";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber dayanya.
        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({
  // Atur yourregion ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke oss-cn-hangzhou.
  region: 'yourregion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // Atur yourbucketname ke nama bucket.
  bucket: 'yourbucketname'
});

// Tentukan versionId objek sumber.
const versionId = 'versionId';
// Tentukan objek sumber.
const srcObject = 'srcObject.txt';
// Tentukan bucket sumber.
const srcBucket = 'srcBucket';
// Tentukan objek tujuan.
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;
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. 
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket sumber. 
var sourceBucket = "yourSourceBucketName";
// Tentukan path lengkap objek sumber. Jangan sertakan nama bucket dalam path lengkap. 
var sourceObject = "yourSourceObjectName";
// Tentukan nama bucket tujuan. Bucket tujuan harus berada di wilayah yang sama dengan bucket sumber. 
var targetBucket = "yourDestBucketName";
// Tentukan path lengkap objek tujuan. Jangan sertakan nama bucket dalam path lengkap. 
var targetObject = "yourDestObjectName";
// Tentukan ID versi objek sumber. 
var versionid = "yourArchiveObjectVersionid";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur region ke cn-hangzhou.
const string region = "cn-hangzhou";

// Buat instance ClientConfiguration dan ubah parameter default sesuai kebutuhan Anda.
var conf = new ClientConfiguration();

// Gunakan algoritma signature V4.
conf.SignatureVersion = SignatureVersion.V4;

// Buat instance 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)
    {
        // Jika nilai NewObjectMetadata adalah null, mode COPY digunakan dan metadata objek sumber disalin ke objek tujuan. Jika nilai NewObjectMetadata bukan null, mode REPLACE digunakan dan metadata objek sumber menimpa metadata objek tujuan. 
        NewObjectMetadata = metadata, 
        // Tentukan ID versi objek. 
        SourceVersionId = versionid
    };
    // Salin objek. 
    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)
{
    /* Inisialisasi informasi akun OSS. */
            
    /* Atur Endpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Atur Region ke wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Region ke cn-hangzhou. */
    std::string Region = "yourRegion";
    /* Tentukan nama bucket sumber. Contoh: srcexamplebucket. */
    std::string SourceBucketName = "srcexamplebucket";
    /* Tentukan nama bucket tujuan, yang harus berada di wilayah yang sama dengan bucket sumber. Contoh: destbucket. */
    std::string CopyBucketName = "destbucket";
    /* Tentukan path lengkap objek sumber. Path lengkap tidak boleh mengandung nama bucket. Contoh: srcdir/scrobject.txt. */
    std::string SourceObjectName = "srcdir/scrobject.txt";
    /* Tentukan path lengkap objek tujuan. Path lengkap tidak boleh mengandung nama bucket. Contoh: destdir/destobject.txt. */
    std::string CopyObjectName = "destdir/destobject.txt";


    /* Inisialisasi sumber daya jaringan. */
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    CopyObjectRequest request(CopyBucketName, CopyObjectName);
    request.setCopySource(SourceBucketName, SourceObjectName);
    /* Tentukan ID versi objek sumber. */
    request.setVersionId("yourSourceObjectVersionId");

    /* Salin versi objek yang ditentukan. */
    auto outcome = client.CopyObject(request);

    if (outcome.isSuccess()) {
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
        /* Tangani pengecualian. */
        std::cout << "CopyObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* Lepaskan sumber daya jaringan. */
    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"
)

// Definisikan variabel global.
var (
	region         string // Wilayah tempat objek disimpan.
	srcBucketName  string // Nama bucket sumber.
	srcObjectName  string // Nama objek sumber.
	destBucketName string // Nama bucket tujuan.
	destObjectName string // Nama objek tujuan.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "Nama bucket sumber.")
	flag.StringVar(&srcObjectName, "src-object", "", "Nama objek sumber.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "Nama bucket tujuan.")
	flag.StringVar(&destObjectName, "dest-object", "", "Nama objek tujuan.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket sumber telah ditentukan.
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// Periksa apakah wilayah telah ditentukan.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// Jika nama bucket tujuan tidak ditentukan, nama bucket sumber akan digunakan.
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// Periksa apakah nama objek sumber telah ditentukan.
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// Periksa apakah nama objek tujuan telah ditentukan.
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan salin.
	copyRequest := &oss.CopyObjectRequest{
		Bucket:           oss.Ptr(destBucketName),            // Nama bucket tujuan.
		Key:              oss.Ptr(destObjectName),            // Nama objek tujuan.
		SourceKey:        oss.Ptr(srcObjectName),             // Nama objek sumber.
		SourceBucket:     oss.Ptr(srcBucketName),             // Nama bucket sumber.
		SourceVersionId:  oss.Ptr("yourVersionId"),           // Tentukan ID versi aktual objek sumber.
		StorageClass:     oss.StorageClassStandard,           // Atur kelas penyimpanan ke Standard.
		TaggingDirective: oss.Ptr("Replace"),                 // Tag objek sumber tidak disalin.
		Tagging:          oss.Ptr("tag1=value1&tag2=value2"), // Tentukan tag aktual objek tujuan.
	}

	// Lakukan operasi dan proses hasilnya.
	copyResult, err := client.CopyObject(context.TODO(), copyRequest)
	if err != nil {
		log.Fatalf("failed to copy object: %v", err)
	}

	// Tampilkan hasilnya.
	log.Printf("copy object result versionId:%#v\n", *copyResult.VersionId)

}
<?php

// Sertakan file autoload untuk memuat dependensi.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Tentukan deskripsi untuk parameter baris perintah.
$optsdesc = [
    "region" => ['help' => Wilayah tempat bucket berada.', 'required' => True], // (Wajib) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // (Opsional) Tentukan endpoint yang dapat digunakan layanan lain untuk mengakses OSS.
    "bucket" => ['help' => Nama bucket, 'required' => True], // (Wajib) Tentukan nama bucket tujuan.
    "key" => ['help' => Nama objek, 'required' => True], // (Wajib) Tentukan nama objek tujuan.
    "src-bucket" => ['help' => 'Nama bucket sumber', 'required' => False], // (Opsional) Tentukan nama bucket sumber.
    "key" => ['help' => Nama objek, 'required' => True], // (Wajib) Tentukan nama objek sumber.
];

// Ubah deskripsi parameter menjadi daftar opsi panjang yang diperlukan oleh getopt.
// Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parsing parameter baris perintah.
$options = getopt("", $longopts);

// Periksa apakah parameter wajib dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan tentang parameter.
        echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
        exit(1); // Jika parameter wajib tidak dikonfigurasi, keluar dari program.
    }
}

// Dapatkan nilai dari parameter yang diuraikan.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket tujuan.
$key = $options["key"]; // Nama objek tujuan.
$srcKey = $options["src-key"]; // Nama objek sumber.

// Dapatkan kredensial akses dari variabel lingkungan.
// Dapatkan ID AccessKey dan Rahasia AccessKey dari variabel lingkungan EnvironmentVariableCredentialsProvider.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Tentukan penyedia kredensial.
$cfg->setRegion($region); // Tentukan wilayah tempat bucket berada.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // Tentukan endpoint jika endpoint disediakan.
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Buat objek CopyObjectRequest untuk menyalin objek sumber.
$request = new Oss\Models\CopyObjectRequest(
            bucket: $bucket,
            key: $key,
            sourceVersionId: "yourVersionId",// Tentukan ID versi objek sumber.
);

if (!empty($options["src-bucket"])) {
    $request->sourceBucket = $options["src-bucket"]; // Jika nama bucket sumber disediakan, tentukan parameter sourceBucket.
}
$request->sourceKey = $srcKey; // Tentukan nama objek sumber.

// Lakukan operasi salin objek.
$result = $client->copyObject($request);

// Tampilkan hasil salin objek.
printf(
    'status code:' . $result->statusCode . PHP_EOL . // Kode status HTTP. Misalnya, kode status HTTP 200 menunjukkan bahwa permintaan berhasil.
    'request id:' . $result-> requestId. PHP_EOL //  ID permintaan, yang digunakan untuk debug atau melacak permintaan.
);
import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah dan jelaskan tujuan skrip: menyalin objek di bucket.
parser = argparse.ArgumentParser(description="copy object sample")

# Definisikan argumen baris perintah, termasuk wilayah wajib, nama bucket tujuan, nama bucket sumber, nama objek tujuan, nama objek sumber, ID versi objek sumber, dan endpoint opsional.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
parser.add_argument('--bucket', help='Nama bucket tujuan.', required=True)
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
parser.add_argument('--key', help='Nama objek tujuan.', required=True)
parser.add_argument('--source_key', help='Nama objek sumber.', required=True)
parser.add_argument('--source_bucket', help='Nama bucket sumber.', required=True)
parser.add_argument('--source_version_id', help='ID versi objek sumber.',required=True)

def main():
    # Parsing argumen baris perintah untuk mendapatkan nilai yang dimasukkan pengguna.
    args = parser.parse_args()

    # Muat informasi kredensial akses dari variabel lingkungan untuk verifikasi identitas.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Gunakan konfigurasi SDK default untuk membuat objek konfigurasi dan atur penyedia autentikasi.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # Atur properti region objek konfigurasi berdasarkan argumen baris perintah.
    cfg.region = args.region

    # Jika endpoint kustom disediakan, perbarui properti endpoint dalam objek konfigurasi.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi sebelumnya untuk menginisialisasi klien OSS dan mempersiapkan interaksi dengan OSS.
    client = oss.Client(cfg)

    # Kirim permintaan untuk menyalin objek tertentu.
    result = client.copy_object(oss.CopyObjectRequest(
        bucket=args.bucket,  # Nama bucket tujuan.
        key=args.key,  # Nama objek tujuan.
        source_key=args.source_key,  # Nama objek sumber.
        source_bucket=args.source_bucket,  # Nama bucket sumber.
        source_version_id=args.source_version_id,  # ID versi objek sumber.
    ))

    # Cetak informasi tentang hasil operasi untuk mengonfirmasi status permintaan.
    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},'
          )

# Saat skrip ini dijalankan langsung, panggil fungsi main untuk memulai logika pemrosesan.
if __name__ == "__main__":
    main()  # Titik masuk skrip. Alur program dimulai di sini.

Gunakan ossutil

Untuk informasi selengkapnya tentang cara memulihkan versi sebelumnya objek sebagai versi terkini di bucket yang diaktifkan versioning-nya menggunakan ossutil, lihat revert.

Gunakan REST API

Jika program Anda memerlukan opsi kustom lebih lanjut, Anda dapat mengirim permintaan REST API secara langsung. Hal ini mengharuskan Anda menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya, lihat CopyObject.