日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

開(kāi)啟版本控制下Object的操作

更新時(shí)間:
重要

本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。

存儲(chǔ)空間(Bucket)開(kāi)啟版本控制后,OSS會(huì)為Bucket中所有文件(Object)的每個(gè)版本指定唯一的ID值,且Bucket中現(xiàn)有Object的內(nèi)容和權(quán)限保持不變。開(kāi)啟版本控制后,還能夠防止意外覆蓋或者刪除Object ,并允許查詢和恢復(fù)Object的歷史版本。

注意事項(xiàng)

當(dāng)您在已開(kāi)啟版本控制的Bucket中進(jìn)行上傳文件、列舉文件、下載文件、刪除文件、恢復(fù)文件等操作時(shí),有如下注意事項(xiàng):

  • 對(duì)于已開(kāi)啟版本控制的Bucket中的Object,OSS會(huì)維護(hù)一個(gè)當(dāng)前版本Object以及零個(gè)或零個(gè)以上歷史版本Object。

  • 如果在Bucket開(kāi)啟版本控制前上傳了Object,則OSSObject的版本ID值置為null。

  • 本文圖示中的版本ID均以簡(jiǎn)短版本ID代替。

關(guān)于版本控制的更多信息,請(qǐng)參見(jiàn)版本控制介紹

上傳文件

在已開(kāi)啟版本控制的Bucket中上傳Object時(shí),OSS會(huì)為這些上傳的Object自動(dòng)添加唯一的版本ID。

說(shuō)明

PutObject、PostObject、CopyObject 、MultipartUpload等操作都會(huì)為新生成的Object自動(dòng)添加唯一的版本ID。

通過(guò)PUT操作上傳Object(key=example.jpg)時(shí),OSS為該Object指定了唯一的版本號(hào)(ID=111111),如下圖所示。

通過(guò)PUT操作第一次上傳同名Object(key=example.jpg)時(shí),原始Object版本(ID=111111)作為歷史版本,生成的新版本(ID=222222)將作為當(dāng)前版本保存在Bucket中。當(dāng)再次上傳同名Object時(shí),原始Object版本(包括ID=111111以及ID=222222)將作為歷史版本,而生成的新版本(ID=333333)則作為當(dāng)前版本保存在Bucket中,如下圖所示。

使用OSS控制臺(tái)

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

  3. 在左側(cè)導(dǎo)航欄,選擇文件管理>文件列表

  4. 文件列表頁(yè)面,單擊上傳文件

  5. 上傳文件面板,按如下說(shuō)明配置各項(xiàng)參數(shù)。

    1. 設(shè)置基礎(chǔ)選項(xiàng)。

      參數(shù)

      說(shuō)明

      上傳到

      設(shè)置文件上傳到目標(biāo)Bucket后的存儲(chǔ)路徑。

      • 當(dāng)前目錄:將文件上傳到當(dāng)前目錄。

      • 指定目錄:將文件上傳到指定目錄,您需要輸入目錄名稱(chēng)。如果輸入的目錄不存在,OSS將自動(dòng)創(chuàng)建對(duì)應(yīng)的文件目錄并將文件上傳到該目錄中。

        目錄命名規(guī)范如下:

        • 請(qǐng)使用符合要求的UTF-8字符;長(zhǎng)度必須在1~254字符之間。

        • 不允許以正斜線(/)或反斜線(\)開(kāi)頭。

        • 不允許出現(xiàn)連續(xù)的正斜線(/)。

        • 不允許出現(xiàn)名為 .. 的目錄。

      文件ACL

      設(shè)置文件讀寫(xiě)權(quán)限ACL。

      • 繼承Bucket:以Bucket讀寫(xiě)權(quán)限為準(zhǔn)。

      • 私有(推薦):只有文件Owner擁有該文件的讀寫(xiě)權(quán)限,其他用戶沒(méi)有權(quán)限操作該文件。

      • 公共讀:文件Owner擁有該文件的讀寫(xiě)權(quán)限,其他用戶(包括匿名訪問(wèn)者)都可以對(duì)文件進(jìn)行訪問(wèn),這有可能造成您數(shù)據(jù)的外泄以及費(fèi)用激增,請(qǐng)謹(jǐn)慎操作。

      • 公共讀寫(xiě):任何用戶(包括匿名訪問(wèn)者)都可以對(duì)文件進(jìn)行訪問(wèn),并且向該文件寫(xiě)入數(shù)據(jù)。這有可能造成您數(shù)據(jù)的外泄以及費(fèi)用激增。如果被人惡意寫(xiě)入違法信息還可能會(huì)侵害您的合法權(quán)益。除特殊場(chǎng)景外,不建議您為文件配置公共讀寫(xiě)權(quán)限。

      關(guān)于文件ACL的更多信息,請(qǐng)參見(jiàn)設(shè)置Object ACL

      待上傳文件

      選擇您需要上傳的文件或文件夾。

      您可以單擊掃描文件掃描文件夾選擇本地文件或文件夾,或者直接拖拽目標(biāo)文件或文件夾到待上傳文件區(qū)域。

      如果上傳文件夾中包含了無(wú)需上傳的文件,請(qǐng)單擊目標(biāo)文件操作列的移除將其移出文件列表。

      重要
      • 在未開(kāi)啟版本控制的Bucket中上傳文件時(shí),如果上傳的文件與已有文件同名,則覆蓋已有文件。

      • 在已開(kāi)啟版本控制的Bucket中上傳文件時(shí),如果上傳的文件與已有文件同名,則上傳的文件將成為最新版本,已有文件將成為歷史版本。

    2. 可選:單擊高級(jí)選項(xiàng)右側(cè)的image.png圖標(biāo),設(shè)置文件存儲(chǔ)類(lèi)型、加密方式等高級(jí)選項(xiàng)。

      參數(shù)

      說(shuō)明

      存儲(chǔ)類(lèi)型

      設(shè)置文件存儲(chǔ)類(lèi)型。 取值范圍如下:

      • 繼承Bucket(默認(rèn)):以Bucket存儲(chǔ)類(lèi)型為準(zhǔn)。

      • 標(biāo)準(zhǔn)存儲(chǔ)提供高可靠、高可用、高性能的對(duì)象存儲(chǔ)服務(wù),能夠支持頻繁的數(shù)據(jù)訪問(wèn)。適用于各種社交、分享類(lèi)的圖片、音視頻應(yīng)用、大型網(wǎng)站、大數(shù)據(jù)分析等業(yè)務(wù)場(chǎng)景。

      • 低頻訪問(wèn)存儲(chǔ)提供高持久性、較低存儲(chǔ)成本的對(duì)象存儲(chǔ)服務(wù)。有最小計(jì)量單位(64 KB)和最低存儲(chǔ)時(shí)間(30天)的要求。支持?jǐn)?shù)據(jù)實(shí)時(shí)訪問(wèn),訪問(wèn)數(shù)據(jù)時(shí)會(huì)產(chǎn)生數(shù)據(jù)取回費(fèi)用。適用于較低訪問(wèn)頻率(平均每月訪問(wèn)頻率12次)的業(yè)務(wù)場(chǎng)景。

      • 歸檔存儲(chǔ)提供高持久性、極低存儲(chǔ)成本的對(duì)象存儲(chǔ)服務(wù)。有最小計(jì)量單位(64 KB)和最低存儲(chǔ)時(shí)間(60天)的要求。數(shù)據(jù)需解凍(約1分鐘)后訪問(wèn),會(huì)產(chǎn)生數(shù)據(jù)解凍費(fèi)用。如果開(kāi)啟歸檔直讀,無(wú)需解凍就可以訪問(wèn)數(shù)據(jù),會(huì)產(chǎn)生數(shù)據(jù)直讀取回費(fèi)用。適用于數(shù)據(jù)長(zhǎng)期保存的業(yè)務(wù)場(chǎng)景,例如檔案數(shù)據(jù)、醫(yī)療影像、科學(xué)資料、影視素材等。

      • 冷歸檔存儲(chǔ)提供高持久性、比歸檔存儲(chǔ)的存儲(chǔ)成本更低的對(duì)象存儲(chǔ)服務(wù)。有最小計(jì)量單位(64 KB)和最低存儲(chǔ)時(shí)間(180天)的要求。數(shù)據(jù)需解凍后訪問(wèn),解凍時(shí)間根據(jù)數(shù)據(jù)大小和選擇的解凍模式?jīng)Q定,解凍會(huì)產(chǎn)生數(shù)據(jù)取回費(fèi)用以及取回請(qǐng)求費(fèi)用。適用于需要超長(zhǎng)時(shí)間存放的冷數(shù)據(jù),例如因合規(guī)要求需要長(zhǎng)期留存的數(shù)據(jù)、大數(shù)據(jù)及人工智能領(lǐng)域長(zhǎng)期積累的原始數(shù)據(jù)、影視行業(yè)長(zhǎng)期留存的媒體資源、在線教育行業(yè)的歸檔視頻等業(yè)務(wù)場(chǎng)景。

      • 深度冷歸檔存儲(chǔ)提供高持久性、比冷歸檔存儲(chǔ)成本更低的對(duì)象存儲(chǔ)服務(wù)。有最小計(jì)量單位(64 KB)和最低存儲(chǔ)時(shí)間(180天)的要求。數(shù)據(jù)需解凍后訪問(wèn),解凍時(shí)間根據(jù)數(shù)據(jù)大小和選擇的解凍模式?jīng)Q定,解凍會(huì)產(chǎn)生數(shù)據(jù)取回費(fèi)用以及取回請(qǐng)求費(fèi)用。適用于需要超長(zhǎng)時(shí)間存放的極冷數(shù)據(jù),例如大數(shù)據(jù)及人工智能領(lǐng)域的原始數(shù)據(jù)的長(zhǎng)期積累留存、媒體數(shù)據(jù)的長(zhǎng)期保留、法規(guī)和合規(guī)性存檔、磁帶替換等業(yè)務(wù)場(chǎng)景。

      更多信息,請(qǐng)參見(jiàn)存儲(chǔ)類(lèi)型介紹

      服務(wù)端加密方式

      設(shè)置文件的服務(wù)端加密方式。 取值范圍如下:

      • 繼承 Bucket(默認(rèn)):以Bucket的服務(wù)器端加密方式為準(zhǔn)。

      • OSS完全托管:使用OSS托管的密鑰進(jìn)行加密。OSS會(huì)為每個(gè)Object使用不同的密鑰進(jìn)行加密,作為額外的保護(hù),OSS會(huì)使用主密鑰對(duì)加密密鑰本身進(jìn)行加密。

      • KMS:使用KMS默認(rèn)托管的CMK或指定CMK ID進(jìn)行加解密操作。

        使用KMS加密方式前,需要開(kāi)通KMS服務(wù)。具體操作,請(qǐng)參見(jiàn)開(kāi)通密鑰管理服務(wù)

        KMS對(duì)應(yīng)的加密密鑰說(shuō)明如下:

        加密密鑰格式為<alias>(CMK ID)。其中<alias>為用戶主密鑰的別名,CMK ID為用戶主密鑰ID。取值范圍如下:

        • alias/acs/oss(CMK ID):使用默認(rèn)托管的CMK生成不同的密鑰來(lái)加密不同的Object,并且在Object被下載時(shí)自動(dòng)解密。

        • alias/<cmkname>(CMK ID):使用指定的CMK生成不同的密鑰來(lái)加密不同的Object,并將加密ObjectCMK ID記錄到Object的元數(shù)據(jù)中,具有解密權(quán)限的用戶下載Object時(shí)會(huì)自動(dòng)解密。其中<cmkname>為創(chuàng)建密鑰時(shí)配置的主密鑰可選標(biāo)識(shí)。

          使用指定的CMK ID前,您需要在KMS管理控制臺(tái)創(chuàng)建一個(gè)與Bucket處于相同地域的普通密鑰或外部密鑰。具體操作,請(qǐng)參見(jiàn)創(chuàng)建密鑰

      • 加密算法可選擇AES256SM4加密算法。

      用戶自定義元數(shù)據(jù)

      用于為Object添加描述信息。您可以添加多條自定義元數(shù)據(jù)(User Meta),但所有的自定義元數(shù)據(jù)總大小不能超過(guò)8 KB。添加自定義元數(shù)據(jù)時(shí),要求參數(shù)以x-oss-meta-為前綴,并為參數(shù)賦值,例如x-oss-meta-location:hangzhou

    3. 單擊上傳文件

      此時(shí),您可以在任務(wù)列表面板的上傳列表頁(yè)簽查看各個(gè)文件的上傳進(jìn)度。

使用阿里云SDK

以下僅列舉常見(jiàn)SDK在已開(kāi)啟版本控制的Bucket中簡(jiǎn)單上傳文件的代碼示例。關(guān)于其他SDK簡(jiǎn)單上傳的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫(xiě)Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
        String objectName = "exampledir/object";

        // 創(chuàng)建OSSClient實(shí)例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 以上傳字符串為例。
            String content = "Hello OSS";
            PutObjectResult result = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            // 查看此次上傳Object的VersionId。
            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();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑,例如example/test.txt。
$object = "<yourObjectName>";
$content = "hello world";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

try {
    // 在受版本控制的Bucket中上傳Object。
    $ret = $ossClient->putObject($bucket, $object, $content);

    // 查看Object的版本信息。
    print("versionId:" .$ret[OssClient::OSS_HEADER_VERSION_ID]);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // yourbucketname填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  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']); // 查看此次上傳object的版本ID。
}
put();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 上傳文件。
result = bucket.put_object('yourObjectName', 'content of object')
# HTTP返回碼。
print('http response code: {0}'.format(result.status))
# 查看本次上傳Object的版本ID。
print('put object version:', result.versionid)
using System.Text;
using Aliyun.OSS;
// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
var bucketName = "examplebucket";
// 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// 創(chuàng)建OSSClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
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);
}
package main

import (
  "fmt"
  "net/http"
  "os"
  "strings"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 創(chuàng)建OSSClient實(shí)例。
    // yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket, err := client.Bucket("yourBucketName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  var retHeader http.Header
  // 上傳字符串。用oss.GetResponseHeader獲取返回header。
  // yourObjectName填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑。
  err = bucket.PutObject("yourObjectName", strings.NewReader("yourObjectValue"), oss.GetResponseHeader(&retHeader))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 打印x-oss-version-id。
  fmt.Println("x-oss-version-id:", oss.GetVersionId(retHeader))
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS賬號(hào)信息。*/
            
    /* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* 初始化網(wǎng)絡(luò)等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    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;
    }

    /* 釋放網(wǎng)絡(luò)等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令行工具ossutil

關(guān)于使用ossutil在已開(kāi)啟版本控制的Bucket中簡(jiǎn)單上傳文件的具體操作, 請(qǐng)參見(jiàn)cp(上傳文件)

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)PutObject

列舉文件

在已開(kāi)啟版本控制的Bucket中,您可以使用GetBucketVersions(ListObjectVersions)接口獲取Object的所有版本信息,包括刪除標(biāo)記(Delete Marker)。

  • GetBucketVersions(ListObjectVersions)不同的是,GetBucket(ListObject)接口僅返回Object的當(dāng)前版本,且當(dāng)前版本不為刪除標(biāo)記。

  • 單個(gè)GetBucketVersions(ListObjectVersions)請(qǐng)求最多返回1000個(gè)版本Object。您可以通過(guò)發(fā)送多次請(qǐng)求來(lái)獲取Object的所有版本。

    例如,如果Bucket中包含兩個(gè)Key(如example.jpgphoto.jpg),且第一個(gè)Key(example.jpg)有900個(gè)版本,第二個(gè)Key(photo.jpg)有500個(gè)版本,則單個(gè)請(qǐng)求將先按照Key的字母序,再按照版本的新舊順序依次列舉example.jpg的所有900個(gè)版本以及photo.jpg100個(gè)版本。

如下圖所示,在開(kāi)啟了版本控制的Bucket中,調(diào)用GetBucketVersions(ListObjectVersions)接口時(shí),返回了Bucket中所有Object的所有版本,包含當(dāng)前版本為刪除標(biāo)記的Object ;調(diào)用GetBucket(ListObject)接口時(shí),則僅返回Object的當(dāng)前版本,且當(dāng)前版本不能為刪除標(biāo)記,因此僅返回當(dāng)前版本ID444444Object。

使用OSS控制臺(tái)

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

    當(dāng)前頁(yè)面將分頁(yè)顯示該Bucket中所有Object的當(dāng)前版本,且當(dāng)前版本不能為刪除標(biāo)記。如果您需要查看該Bucket中包含刪除標(biāo)記在內(nèi)所有Object的所有版本,請(qǐng)?jiān)?b data-tag="uicontrol" id="uicontrol-7uh-738-nm2" class="uicontrol">文件列表頁(yè)面單擊歷史版本右側(cè)的顯示

使用阿里云SDK

以下僅列舉常見(jiàn)SDK在已開(kāi)啟版本控制的Bucket中列舉文件的代碼示例。關(guān)于其他SDK列舉文件的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
        String bucketName = "examplebucket";

        // 創(chuàng)建OSSClient實(shí)例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 列舉包括刪除標(biāo)記在內(nèi)的所有Object的版本信息。
            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();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
$bucket= "examplebucket";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

try{
    $option = array(
        OssClient::OSS_KEY_MARKER => null,
        OssClient::OSS_VERSION_ID_MARKER => null
    );
    $bool = true;
    while ($bool){
        $result = $ossClient->listObjectVersions($bucket,$option);
        // 查看Object的版本信息。
        foreach ($result->getObjectVersionList() as $key => $info){
            printf("key name: {$info->getKey()}\n");
            printf("versionid: {$info->getVersionId()}\n");
            printf("Is latest: {$info->getIsLatest()}\n\n");
        }

        // 查看刪除標(biāo)記的版本信息。
        foreach ($result->getDeleteMarkerList() as $key => $info){
            printf("del_maker key name: {$info->getKey()}\n");
            printf("del_maker versionid: {$info->getVersionId()}\n");
            printf("del_maker Is latest: {$info->getIsLatest()}\n\n");
        }

        if($result->getIsTruncated() === 'true'){
            $option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
        $option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
        }else{
            $bool = false;
        }
    }
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}
const OSS = require("ali-oss");

const client = new OSS({
  // yourregion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket: 'yourbucketname'
});

// 列舉包括刪除標(biāo)記在內(nèi)的所有Object的版本信息。
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();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 開(kāi)啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。
# 列舉Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。
result = bucket.list_object_versions()

# 列舉所有Object的版本信息。
next_key_marker = None
next_versionid_marker = None
while True:
    result = bucket.list_object_versions(key_marker=next_key_marker, versionid_marker=next_versionid_marker)

    # 查看列舉Object的版本信息。
    for version_info in result.versions:
        print('version_info.versionid:', version_info.versionid)
        print('version_info.key:', version_info.key)
        print('version_info.is_latest:', version_info.is_latest)

    # 查看列舉刪除標(biāo)記的版本信息。
    for del_maker_Info in result.delete_marker:
        print('del_maker.key:', del_maker_Info.key)
        print('del_maker.versionid:', del_maker_Info.versionid)
        print('del_maker.is_latest:', del_maker_Info.is_latest)

    is_truncated = result.is_truncated

    # 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)羅列。如果結(jié)果已完整,則退出循環(huán)。
    if is_truncated:
        next_key_marker = result.next_key_marker
        next_versionid_marker = result.next_versionid_marker
    else:
        break
package main

import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

func main() {
    // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    // 創(chuàng)建OSSClient實(shí)例。
    // yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 填寫(xiě)B(tài)ucket名稱(chēng)。
    bucketName := "examplebucket"
    bucket,err := client.Bucket(bucketName)
    if err != nil {
        HandleError(err)
    }

    // 列舉包括刪除標(biāo)記在內(nèi)的所有Object。
    keyMarker := oss.KeyMarker("")
    // VersionIdMarker與KeyMarker參數(shù)一同使用,以指定列舉的起點(diǎn)。
    versionIdMarker := oss.VersionIdMarker("")
    for {
        lor, err := bucket.ListObjectVersions(keyMarker,versionIdMarker)
        if err != nil {
            HandleError(err)
        }

        // 查看Object的版本信息。
        for _, dirName := range lor.ObjectVersions{
            fmt.Println("Versionid:",dirName.VersionId)
            fmt.Println("Key:",dirName.Key)
            fmt.Println("Is Latest",dirName.IsLatest)
        }
        // 查看刪除標(biāo)記的版本信息。
         for _, marker  := range lor.ObjectDeleteMarkers {
            fmt.Println(marker.VersionId)
            fmt.Println(marker.Key)
        }
        // 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)列舉。如果結(jié)果已完整,則退出循環(huán)。
        keyMarker = oss.KeyMarker(lor.NextKeyMarker)
        versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
        if !lor.IsTruncated {
            break
        }
    }
}

使用命令行工具ossutil

關(guān)于在已開(kāi)啟版本控制的Bucket中列舉文件的具體操作,請(qǐng)參見(jiàn)列舉Object

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)ListObjectVersions(GetBucketVersions)

下載文件

您可以在已開(kāi)啟版本控制的Bucket中下載當(dāng)前版本或指定版本的Object。

通過(guò)GET請(qǐng)求下載Object時(shí),如果未指定Object的版本ID,默認(rèn)情況下返回Object的當(dāng)前版本。如下圖所示返回Object的當(dāng)前版本(ID=333333)。

如果當(dāng)前版本為刪除標(biāo)記(Delete Marker),在執(zhí)行GET操作時(shí),OSS會(huì)返回404 Not Found。

如果要下載指定的Object版本,則通過(guò)GET請(qǐng)求下載Object時(shí)需要指定其版本ID ,如下圖所示獲取指定版本ID222222Object。

使用OSS控制臺(tái)

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

  3. 在左側(cè)導(dǎo)航欄,選擇文件管理>文件列表

  4. 文件列表頁(yè)面,單擊歷史版本右側(cè)的顯示

  5. 單擊指定版本的Object,在彈出的面板單擊文件URL右側(cè)的下載

使用阿里云SDK

以下僅列舉常見(jiàn)SDK在已開(kāi)啟版本控制的Bucket中下載文件的代碼示例。關(guān)于其他SDK下載文件的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

說(shuō)明

Python示例為Python2版本。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
$accessKeyId = getenv("OSS_ACCESS_KEY_ID"); 
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑,例如example/test.txt。
$object = "<yourObjectName>";
// 指定Object的版本ID。
$versionId = "<yourObjectVersionId>";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

try{
    // 下載指定版本ID的Object。
    $content = $ossClient->getObject($bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId));
    print($content);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");          
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // yourbucketname填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket: 'yourbucketname'
});

async function get() {
  // 文件名稱(chēng)。
  const result = await client.get('filename', {    
      // 查看下載文件的版本ID。
      versionId: 'versionid',
  });
  console.log(result.content);
}
get();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')

# 下載指定版本的Object。
params = dict()
params['versionId'] = '<yourObjectVersionId>'
object_stream = bucket.get_object('<yourObjectName>', params=params)

# 讀取下載的Object內(nèi)容。
read_content = object_stream.read()
print('get object content:', read_content)
# 查看本次下載的object的版本ID。
print('get object versionid:', object_stream.versionid)

# 由于get_object接口返回的是一個(gè)stream流,需要執(zhí)行read()后才能計(jì)算出返回Object數(shù)據(jù)的CRC checksum,因此需要在調(diào)用該接口后做CRC校驗(yàn)。
if object_stream.client_crc != object_stream.server_crc:
   print("The CRC checksum between client and server is inconsistent!")
package main

import (
  "fmt"
  "net/http"
  "os"  

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    /// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 創(chuàng)建OSSClient實(shí)例。
    // yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
      fmt.Println("Error:", err)
      os.Exit(-1)
  }

  // yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket, err := client.Bucket("<yourBucketName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  var retHeader http.Header
  // 下載yourObjectVersionId版本的文件到緩存。
  // yourObjectName填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑。
  _, err = bucket.GetObject("youObjectName", oss.VersionId("yourObjectVersionId"), oss.GetResponseHeader(&retHeader))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 打印x-oss-version-id。
  fmt.Println("x-oss-version-id:",  oss.GetVersionId(retHeader))
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS賬號(hào)信息。*/
            
    /* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* 初始化網(wǎng)絡(luò)等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* 獲取文件到本地內(nèi)存。*/
    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;
        /* 讀取下載的Object內(nèi)容。*/
        std::string content;
        *(outcome.result().Content()) >> content;
        std::cout << "getObjectToBuffer" << "content:" << content << std::endl;
        /* 查看本次下載Object的版本ID。*/
        std::cout << "versionid:" << outcome.result().VersionId() << std::endl;
    }
    else {
            /* 異常處理。*/
            std::cout << "getObjectToBuffer fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 釋放網(wǎng)絡(luò)等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令行工具ossutil

關(guān)于使用ossutil在已開(kāi)啟版本控制的Bucket中下載文件的具體操作,請(qǐng)參見(jiàn)cp(下載文件)

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)GetObject

刪除文件

開(kāi)啟版本控制后,您可以通過(guò)指定Object版本ID或者配置LifecycleObject永久刪除。如果刪除Object時(shí)未指定版本ID,則Bucket中將插入一個(gè)刪除標(biāo)記(Delete Marker)作為當(dāng)前版本。

重要
  • 開(kāi)啟版本控制后,如果刪除Object時(shí)未指定版本ID,默認(rèn)不會(huì)刪除Object的當(dāng)前版本以及歷史版本。

  • 同一個(gè)Bucket請(qǐng)勿同時(shí)開(kāi)通OSS-HDFS服務(wù)和版本控制。

    如果某個(gè)Bucket已同時(shí)開(kāi)通OSS-HDFS服務(wù)和版本控制,可能導(dǎo)致OSS-HDFS服務(wù)異常。為保證OSS-HDFS服務(wù)的穩(wěn)定性,您需要盡快暫停版本控制,同時(shí)配置生命周期規(guī)則清理刪除標(biāo)記。

    具體操作,請(qǐng)參見(jiàn)同時(shí)開(kāi)通OSS-HDFS服務(wù)和版本控制的Bucket如何處理?

此外,您還可以在已開(kāi)啟版本控制的Bucket中通過(guò)生命周期規(guī)則的Expiration元素指定Object當(dāng)前版本過(guò)期,還可以通過(guò)NoncurrentVersionExpiration元素永久刪除非當(dāng)前版本Object,對(duì)于這兩種元素的詳細(xì)說(shuō)明如下:

  • Expiration元素應(yīng)用于當(dāng)前Object版本,OSS通過(guò)添加刪除標(biāo)記將當(dāng)前版本作為非當(dāng)前版本保留,而不是刪除當(dāng)前版本Object,然后刪除標(biāo)記將成為Object的當(dāng)前版本。

  • NoncurrentVersionExpiration元素適用于非當(dāng)前版本Object,OSS會(huì)永久刪除這些Object版本,且無(wú)法恢復(fù)永久刪除的Object。

關(guān)于版本控制結(jié)合生命周期的更多信息,請(qǐng)參見(jiàn)生命周期配置元素

以下分別說(shuō)明在未指定版本ID以及指定版本ID的情況下,執(zhí)行DELETE操作時(shí)Object的刪除行為。

  • 如果未指定Object的版本ID,則OSS會(huì)插入一個(gè)刪除標(biāo)記作為當(dāng)前版本,該刪除標(biāo)記也會(huì)有相應(yīng)的唯一版本ID,但沒(méi)有相關(guān)數(shù)據(jù)和ACL等,如下圖所示(當(dāng)前版本為刪除標(biāo)記,且版本ID=444444)。

  • 如果指定了Object的版本ID,則永久刪除該指定版本的Object,如下圖所示(即刪除版本ID=333333Object)。

使用OSS控制臺(tái)

為了減少存儲(chǔ)費(fèi)用,建議您及時(shí)刪除不再需要的歷史版本Object。

警告

歷史版本Object被刪除后無(wú)法恢復(fù),請(qǐng)謹(jǐn)慎操作。

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

  3. 在左側(cè)導(dǎo)航欄,選擇文件管理>文件列表

  4. 文件列表頁(yè)面,單擊歷史版本右側(cè)的顯示

  5. 找到不再需要的歷史版本Object,根據(jù)實(shí)際選擇相應(yīng)操作。

    • 如果要?jiǎng)h除的歷史版本Object為刪除標(biāo)記,請(qǐng)直接單擊操作列的徹底刪除

    • 如果要?jiǎng)h除的歷史版本Object不為刪除標(biāo)記,請(qǐng)將鼠標(biāo)移動(dòng)到文件操作列的image.png圖標(biāo)上單擊徹底刪除

    您也可以批量選中待刪除的歷史版本,單擊頁(yè)面下方的徹底刪除

  6. 單擊確定

    您也可以通過(guò)配置生命周期規(guī)則,定期自動(dòng)刪除歷史版本Object。更多信息,請(qǐng)參見(jiàn)生命周期規(guī)則介紹

使用阿里云SDK

以下僅列舉常見(jiàn)SDK在已開(kāi)啟版本控制的Bucket中刪除指定版本文件的代碼示例。關(guān)于其他SDK刪除指定版本文件的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
        String bucketName = "examplebucket";
        // 填寫(xiě)Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
        String objectName = "exampledir/object";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";

        // 創(chuàng)建OSSClient實(shí)例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 刪除指定版本的Object。
            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();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑,例如example/test.txt。
$object = "<yourObjectName>";
$versionId = "<yourObjectVersionId>";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

try{
    // 刪除指定versionId的Object。
    $ossClient->deleteObject($bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId));
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");        
const OSS = require("ali-oss");

const client = new OSS({
  // yourregion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket: 'yourbucketname'
});

// 指定Object的versionId。
const versionId = "versionId";
// 指定Object。
const objectName = "exampleobject.txt";
async function deleteVersionObject() {
  const result = await client.delete(objectName, {
    versionId,
  });
  console.log(result);
}

deleteVersionObject();
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# yourObjectName填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑,例如example/test.txt。
object_name = 'yourObjectName'

# 指定Object的versionId,也可以是刪除標(biāo)記的versionId。
params = dict()
params['versionId'] = 'yourObjectVersionIdOrDeleteMarkerVersionId'

# 刪除指定versionId的Object或指定versionId的刪除標(biāo)記關(guān)聯(lián)的Object。
result = bucket.delete_object(object_name, params=params)
print("delete object name: ", object_name)
# 如果指定的是Object的versionId,則返回的delete_marker為None且返回的versionId為指定Object的versionId。
# 如果指定的是刪除標(biāo)記的versionId,則返回的delete_marker為T(mén)rue且返回的versionId為指定刪除標(biāo)記的versionId。
if result.delete_marker:
    print("delete del-marker versionid: ",result.versionid)
else:
    print("delete object versionid:", result.versionid)
using Aliyun.OSS;
// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
var bucketName = "examplebucket";
// 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// 填寫(xiě)Object的版本ID或刪除標(biāo)記的版本ID。
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
// 創(chuàng)建OSSClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 指定Object的versionId,也可以是刪除標(biāo)記的versionId。
    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);
}
package main

import (
  "fmt"
  "os"

  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    /// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 創(chuàng)建OSSClient實(shí)例。
    // yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
       fmt.Println("Error:", err)
       os.Exit(-1)
  }

  // yourBucketName填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket, err := client.Bucket("yourBucketName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // youObjectName填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑。
  // yourObjectVersionId填寫(xiě)Object的versionId。指定后,將徹底刪除該versionId的Object。
  err = bucket.DeleteObject("youObjectName", oss.VersionId("yourObjectVersionId"))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS賬號(hào)信息。*/
            
    /* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如exampledir/exampleobject.txt。*/
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* 初始化網(wǎng)絡(luò)等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* 刪除指定versionId的Object或指定versionId的刪除標(biāo)記關(guān)聯(lián)的Object。*/
    auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
    /* 如果指定的是Object的versionId,則返回的delete_marker為None且返回的versionId為指定Object的versionId。*/
    /* 如果指定的是刪除標(biāo)記的versionId,則返回的delete_marker為T(mén)rue且返回的versionId為指定刪除標(biāo)記的versionId。*/
    if (!outcome.isSuccess()) {
        /* 異常處理。*/
        std::cout << "DeleteObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 釋放網(wǎng)絡(luò)等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令行工具ossutil

關(guān)于使用ossutil在已開(kāi)啟版本控制的Bucket中刪除文件的具體操作, 請(qǐng)參見(jiàn)刪除Object

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)DeleteObject

恢復(fù)文件

開(kāi)啟版本控制后,BucketObject的所有版本都將得以保留。您可以通過(guò)恢復(fù)指定歷史版本的方式,使得任意Object的歷史版本成為當(dāng)前版本。

您可以通過(guò)以下兩種方式將Object的歷史版本恢復(fù)至當(dāng)前版本:

  • 通過(guò)CopyObject來(lái)恢復(fù)Object的歷史版本

    復(fù)制的Object將成為該Object的當(dāng)前版本,且所有Object版本都將保留。

    如下圖所示,將原Object的歷史版本(ID=222222)復(fù)制到同一個(gè)Bucket中,OSS將為該Object生成新的版本(ID=444444),并將其置為該Object的當(dāng)前版本。因此,該Object同時(shí)具有歷史版本(ID=222222)以及當(dāng)前版本(ID=444444)。

  • 通過(guò)刪除Object的當(dāng)前版本來(lái)恢復(fù)Object的歷史版本

    如下圖所示,當(dāng)您通過(guò)DELETE versionId的方式永久刪除當(dāng)前Object版本(ID=222222)后, 下一個(gè)歷史版本(ID=111111)成為了該Object的當(dāng)前版本。

重要

由于Object的當(dāng)前版本刪除后無(wú)法恢復(fù),建議您通過(guò)CopyObject的方式來(lái)恢復(fù)Object的歷史版本。

使用OSS控制臺(tái)

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

  3. 在左側(cè)導(dǎo)航欄,選擇文件管理>文件列表

  4. 文件列表頁(yè)面,單擊歷史版本右側(cè)的顯示

  5. 將指定歷史版本的Object恢復(fù)為當(dāng)前版本。

    重要

    同一個(gè)Object僅允許恢復(fù)其中的某個(gè)歷史版本,且該歷史版本不能為刪除標(biāo)記。

    • 恢復(fù)單個(gè)Object

      單擊目標(biāo)歷史版本操作列的恢復(fù)

    • 恢復(fù)多個(gè)Object

      選中目標(biāo)歷史版本,單擊頁(yè)面下方的恢復(fù)后,在彈出的對(duì)話框,單擊確定

使用阿里云SDK

以下僅列舉常見(jiàn)SDK在已開(kāi)啟版本控制的Bucket中拷貝指定版本文件的代碼示例。關(guān)于其他SDK拷貝指定版本文件的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

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

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫(xiě)源Bucket名稱(chēng)。
        String sourceBucketName = "srcexamplebucket";
        // 填寫(xiě)源Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
        String sourceObjectName = "srcexampleobject.txt";
        // 填寫(xiě)與源Bucket處于同一地域的目標(biāo)Bucket名稱(chēng)。
        String destinationBucketName = "desexamplebucket";
        // 填寫(xiě)目標(biāo)Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
        String destinationObjectName = "desexampleobject.txt";
        String versionId  = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";

        // 創(chuàng)建OSSClient實(shí)例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        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();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫(xiě)不包含Bucket名稱(chēng)在內(nèi)的Object的完整路徑,例如example/test.txt。
$object = "<yourObjectName>";
$versionId = "<yourObjectVersionId>";
$to_bucket = $bucket;
$to_object = $object . '.copy';

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

try{
    // 拷貝指定版本的Object。
    $ret = $ossClient->copyObject($bucket, $object, $to_bucket, $to_object, array(OssClient::OSS_VERSION_ID => $versionId));
    print("versionId:" .$ret['x-oss-version-id']);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");    
            
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourregion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // yourbucketname填寫(xiě)存儲(chǔ)空間名稱(chēng)。
  bucket: 'yourbucketname'
});

// 指定拷貝源Object的versionId。
const versionId = 'versionId';
// 指定拷貝源Object。
const srcObject = 'srcObject.txt';
// 指定拷貝源Bucket。
const srcBucket = 'srcBucket;
// 指定拷貝目標(biāo)Object。
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()
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫(xiě)源Bucket名稱(chēng),例如srcexamplebucket。
src_bucket_name = 'srcexamplebucket'
# 填寫(xiě)與源Bucket處于同一地域的目標(biāo)Bucket名稱(chēng),例如destexamplebucket。
# 當(dāng)在同一Bucket內(nèi)拷貝文件時(shí),請(qǐng)確保源Bucket名稱(chēng)和目標(biāo)Bucket名稱(chēng)相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', dest_bucket_name)

# 填寫(xiě)源Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如srcexampledir/exampleobject.txt。
src_object_name = 'srcexampledir/exampleobject.txt'
# 填寫(xiě)目標(biāo)Object完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如destexampledir/exampleobject.txt。
dest_object_name = 'destexampledir/exampleobject.txt'
# 填寫(xiě)Object的版本ID。
versionId = 'CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****'

# 拷貝指定版本的文件。
params = dict()
params['versionId'] = versionId

# 從源Bucket中拷貝一個(gè)Object到目標(biāo)Bucket。
result = bucket.copy_object(src_bucket_name, src_object_name, dest_object_name, params=params)
# 查看返回結(jié)果的狀態(tài),如果返回值為200時(shí),表示執(zhí)行成功。
print('result.status:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫(xiě)源Bucket名稱(chēng)。
var sourceBucket = "yourSourceBucketName";
// 填寫(xiě)源Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
var sourceObject = "yourSourceObjectName";
// 填寫(xiě)與源Bucket處于同一地域的目標(biāo)Bucket名稱(chēng)。
var targetBucket = "yourDestBucketName";
// 填寫(xiě)目標(biāo)Object的完整路徑。Object完整路徑中不能包含Bucket名稱(chēng)。
var targetObject = "yourDestObjectName";
// 填寫(xiě)Object的版本ID。
var versionid = "yourArchiveObjectVersionid";
// 創(chuàng)建OssClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    var metadata = new ObjectMetadata();
    metadata.AddHeader("mk1", "mv1");
    metadata.AddHeader("mk2", "mv2");
    var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
    {
        // 如果NewObjectMetadata為null,則為COPY模式(即拷貝源文件的元數(shù)據(jù)),非null則為REPLACE模式(即覆蓋源文件的元數(shù)據(jù))。
        NewObjectMetadata = metadata, 
        // 指定Object的版本ID。
        SourceVersionId = versionid
    };
    // 拷貝文件。
    var result = client.CopyObject(req);
    Console.WriteLine("Copy object succeeded, vesionid:{0}", result.VersionId);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS賬號(hào)信息。*/
            
    /* 填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    /* 填寫(xiě)源Bucket名稱(chēng),例如srcexamplebucket。*/
    std::string SourceBucketName = "srcexamplebucket";
    /* 填寫(xiě)與源Bucket處于同一地域的目標(biāo)Bucket名稱(chēng),例如destbucket。*/
    std::string CopyBucketName = "destbucket";
    /* 填寫(xiě)源Object的完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如srcdir/scrobject.txt。*/
    std::string SourceObjectName = "srcdir/scrobject.txt";
    /* 填寫(xiě)目標(biāo)Object的完整路徑,完整路徑中不能包含Bucket名稱(chēng),例如destdir/destobject.txt。*/
    std::string CopyObjectName = "destdir/destobject.txt";


    /* 初始化網(wǎng)絡(luò)等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    CopyObjectRequest request(CopyBucketName, CopyObjectName);
    request.setCopySource(SourceBucketName, SourceObjectName);
    /* 填寫(xiě)源Object的版本ID。*/
    request.setVersionId("yourSourceObjectVersionId");

    /* 拷貝指定版本的Object。*/
    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;
    }

    /* 釋放網(wǎng)絡(luò)等資源。*/
    ShutdownSdk();
    return 0;
}

使用命令行工具ossutil

關(guān)于使用ossutil在已開(kāi)啟版本控制的Bucket中將歷史版本Object恢復(fù)為當(dāng)前版本Object的具體操作,請(qǐng)參見(jiàn)cp(恢復(fù)文件)

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)CopyObject