儲存空間(Bucket)開啟版本控制後,OSS會為Bucket中所有檔案(Object)的每個版本指定唯一的ID值,且Bucket中現有Object的內容和許可權保持不變。開啟版本控制後,還能夠防止意外覆蓋或者刪除Object ,並允許查詢和恢複Object的歷史版本。
注意事項
當您在已開啟版本控制的Bucket中進行上傳檔案、列舉檔案、下載檔案、刪除檔案、恢複檔案等操作時,有如下注意事項:
對於已開啟版本控制的Bucket中的Object,OSS會維護一個目前的版本Object以及零個或零個以上歷史版本Object。
如果在Bucket開啟版本控制前上傳了Object,則OSS將Object的版本ID值置為null。
本文圖示中的版本ID均以簡短版本ID代替。
關於版本控制的更多資訊,請參見版本控制介紹。
上傳檔案
在已開啟版本控制的Bucket中上傳Object時,OSS會為這些上傳的Object自動添加唯一的版本ID。
PutObject、PostObject、CopyObject 、MultipartUpload等操作都會為新產生的Object自動添加唯一的版本ID。
通過PUT操作上傳Object(key=example.jpg)時,OSS為該Object指定了唯一的版本號碼(ID=111111),如下圖所示。
通過PUT操作第一次上傳同名Object(key=example.jpg)時,原始Object版本(ID=111111)作為歷史版本,產生的新版本(ID=222222)將作為目前的版本儲存在Bucket中。當再次上傳同名Object時,原始Object版本(包括ID=111111以及ID=222222)將作為歷史版本,而產生的新版本(ID=333333)則作為目前的版本儲存在Bucket中,如下圖所示。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇文件管理>檔案清單。
在檔案清單頁面,單擊上傳文件。
在上傳文件面板,按如下說明配置各項參數。
設定基礎選項。
參數
說明
上傳到
設定檔案上傳到目標Bucket後的儲存路徑。
當前目錄:將檔案上傳到目前的目錄。
指定目錄:將檔案上傳到指定目錄,您需要輸入目錄名稱。如果輸入的目錄不存在,OSS將自動建立對應的檔案目錄並將檔案上傳到該目錄中。
目錄命名規範如下:
請使用符合要求的UTF-8字元;長度必須在1~254字元之間。
不允許以正斜線(/)或反斜線(\)開頭。
不允許出現連續的正斜線(/)。
不允許出現名為
..
的目錄。
檔案ACL
設定檔案讀寫權限ACL。
繼承Bucket:以Bucket讀寫權限為準。
私有(推薦):只有檔案Owner擁有該檔案的讀寫權限,其他使用者沒有許可權操作該檔案。
公共讀:檔案Owner擁有該檔案的讀寫權限,其他使用者(包括匿名訪問者)都可以對檔案進行訪問,這有可能造成您資料的外泄以及費用激增,請謹慎操作。
公共讀寫:任何使用者(包括匿名訪問者)都可以對檔案進行訪問,並且向該檔案寫入資料。這有可能造成您資料的外泄以及費用激增。如果被人惡意寫入違法資訊還可能會侵害您的合法權益。除特殊情境外,不建議您為檔案配置公用讀寫許可權。
關於檔案ACL的更多資訊,請參見設定Object ACL。
待上傳檔案
選擇您需要上傳的檔案或檔案夾。
您可以單擊掃描檔案或掃描文件夾選擇本地檔案或檔案夾,或者直接拖拽目標檔案或檔案夾到待上傳檔案地區。
如果上傳檔案夾中包含了無需上傳的檔案,請單擊目標檔案操作列的移除將其移出檔案清單。
重要在未開啟版本控制的Bucket中上傳檔案時,如果上傳的檔案與已有檔案同名,則覆蓋已有檔案。
在已開啟版本控制的Bucket中上傳檔案時,如果上傳的檔案與已有檔案同名,則上傳的檔案將成為最新版本,已有檔案將成為歷史版本。
可選:單擊進階選項右側的表徵圖,設定檔案儲存體類型、加密方式等進階選項。
參數
說明
存儲類型
設定檔案儲存體類型。 取值範圍如下:
繼承Bucket(預設):以Bucket儲存類型為準。
標準儲存:提供高可靠、高可用、高效能的Object Storage Service服務,能夠支援頻繁的資料訪問。適用於各種社交、分享類的圖片、音視頻應用、大型網站、巨量資料分析等業務情境。
低頻訪問儲存:提供高持久性、較低儲存成本的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(30天)的要求。支援資料即時訪問,訪問資料時會產生資料取回費用。適用於較低訪問頻率(平均每月訪問頻率1到2次)的業務情境。
Archive Storage:提供高持久性、極低儲存成本的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(60天)的要求。資料需解凍(約1分鐘)後訪問,會產生資料解凍費用。如果開啟歸檔直讀,無需解凍就可以訪問資料,會產生資料直讀取回費用。適用於資料長期儲存的業務情境,例如檔案資料、醫學影像、科學資料、影視素材等。
冷Archive Storage:提供高持久性、比Archive Storage的儲存成本更低的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(180天)的要求。資料需解凍後訪問,解凍時間根據資料大小和選擇的解凍模式決定,解凍會產生資料取回費用以及取回請求費用。適用於需要超長時間存放的冷資料,例如因合規要求需要長期留存的資料、巨量資料及人工智慧領域長期積累的未經處理資料、影視行業長期留存的媒體資源、線上教育行業的歸檔視頻等業務情境。
深度冷Archive Storage:提供高持久性、比冷Archive Storage成本更低的Object Storage Service服務。有最小計量單位(64 KB)和最低儲存時間(180天)的要求。資料需解凍後訪問,解凍時間根據資料大小和選擇的解凍模式決定,解凍會產生資料取回費用以及取回請求費用。適用於需要超長時間存放的極冷資料,例如巨量資料及人工智慧領域的未經處理資料的長期積累留存、媒體資料的長期保留、法規和合規性存檔、磁帶替換等業務情境。
更多資訊,請參見儲存類型介紹。
服務端加密方式
設定檔案的服務端加密方式。 取值範圍如下:
繼承 Bucket(預設):以Bucket的伺服器端加密方式為準。
OSS完全託管:使用OSS託管的密鑰進行加密。OSS會為每個Object使用不同的密鑰進行加密,作為額外的保護,OSS會使用主要金鑰對加密金鑰本身進行加密。
KMS:使用KMS預設託管的CMK或指定CMK ID進行加解密操作。
使用KMS加密方式前,需要開通KMS服務。具體操作,請參見開通Key Management Service。
KMS對應的加密金鑰說明如下:
加密金鑰格式為
<alias>(CMK ID)
。其中<alias>
為使用者主要金鑰的別名,CMK ID為使用者主要金鑰ID。取值範圍如下:密碼編譯演算法:僅支援AES256密碼編譯演算法。
用戶自訂中繼資料
用於為Object添加描述資訊。您可以添加多條自訂中繼資料(User Meta),但所有的自訂中繼資料總大小不能超過8 KB。添加自訂中繼資料時,要求參數以
x-oss-meta-
為首碼,並為參數賦值,例如x-oss-meta-location:hangzhou。單擊上傳文件。
此時,您可以在工作清單面板的上傳列表頁簽查看各個檔案的上傳進度。
使用阿里雲SDK
以下僅列舉常見SDK在已開啟版本控制的Bucket中簡單上傳檔案的程式碼範例。關於其他SDK簡單上傳的程式碼範例,請參見SDK簡介
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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampledir/object";
// 建立OSSClient執行個體。
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;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫不包含Bucket名稱在內的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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourbucketname填寫儲存空間名稱。
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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
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填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampleobject.txt";
var objectContent = "More than just cloud.";
// 建立OSSClient執行個體。
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() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填寫儲存空間名稱。
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
var retHeader http.Header
// 上傳字串。用oss.GetResponseHeader擷取返回header。
// yourObjectName填寫不包含Bucket名稱在內的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帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
使用命令列工具ossutil
關於使用ossutil在已開啟版本控制的Bucket中簡單上傳檔案的具體操作, 請參見cp(上傳檔案)。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutObject。
列舉檔案
在已開啟版本控制的Bucket中,您可以使用GetBucketVersions(ListObjectVersions)介面擷取Object的所有版本資訊,包括刪除標記(Delete Marker)。
與GetBucketVersions(ListObjectVersions)不同的是,GetBucket(ListObject)介面僅返回Object的目前的版本,且目前的版本不為刪除標記。
單個GetBucketVersions(ListObjectVersions)請求最多返回1000個版本Object。您可以通過發送多次請求來擷取Object的所有版本。
例如,如果Bucket中包含兩個Key(如example.jpg和photo.jpg),且第一個Key(example.jpg)有900個版本,第二個Key(photo.jpg)有500個版本,則單個請求將先按照Key的字母序,再按照版本的新舊順序依次列舉example.jpg的所有900個版本以及photo.jpg的100個版本。
如下圖所示,在開啟了版本控制的Bucket中,調用GetBucketVersions(ListObjectVersions)介面時,返回了Bucket中所有Object的所有版本,包含目前的版本為刪除標記的Object ;調用GetBucket(ListObject)介面時,則僅返回Object的目前的版本,且目前的版本不能為刪除標記,因此僅返回目前的版本ID為444444的Object。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
當前頁面將分頁顯示該Bucket中所有Object的目前的版本,且目前的版本不能為刪除標記。如果您需要查看該Bucket中包含刪除標記在內所有Object的所有版本,請在檔案清單頁面單擊歷史版本右側的顯示。
使用阿里雲SDK
以下僅列舉常見SDK在已開啟版本控制的Bucket中列舉檔案的程式碼範例。關於其他SDK列舉檔案的程式碼範例,請參見SDK簡介
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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 建立OSSClient執行個體。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 列舉包括刪除標記在內的所有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;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫Bucket名稱,例如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");
}
// 查看刪除標記的版本資訊。
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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫儲存空間名稱。
bucket: 'yourbucketname'
});
// 列舉包括刪除標記在內的所有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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。
# 列舉Bucket中包括刪除標記(Delete Marker)在內的所有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)
# 查看列舉刪除標記的版本資訊。
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
# 查看列舉結果是否完整。如果結果不完整,則繼續羅列。如果結果已完整,則退出迴圈。
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() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫Bucket名稱。
bucketName := "examplebucket"
bucket,err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 列舉包括刪除標記在內的所有Object。
keyMarker := oss.KeyMarker("")
// VersionIdMarker與KeyMarker參數一同使用,以指定列舉的起點。
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)
}
// 查看刪除標記的版本資訊。
for _, marker := range lor.ObjectDeleteMarkers {
fmt.Println(marker.VersionId)
fmt.Println(marker.Key)
}
// 查看列舉結果是否完整。如果結果不完整,則繼續列舉。如果結果已完整,則退出迴圈。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
使用命令列工具ossutil
關於在已開啟版本控制的Bucket中列舉檔案的具體操作,請參見列舉Object。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見ListObjectVersions(GetBucketVersions)。
下載檔案
您可以在已開啟版本控制的Bucket中下載目前的版本或指定版本的Object。
通過GET請求下載Object時,如果未指定Object的版本ID,預設情況下返回Object的目前的版本。如下圖所示返回Object的目前的版本(ID=333333)。
如果目前的版本為刪除標記(Delete Marker),在執行GET操作時,OSS會返回404 Not Found。
如果要下載指定的Object版本,則通過GET請求下載Object時需要指定其版本ID ,如下圖所示擷取指定版本ID為222222的Object。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇文件管理>檔案清單。
在檔案清單頁面,單擊歷史版本右側的顯示。
單擊指定版本的Object,在彈出的面板單擊檔案URL右側的下載。
使用阿里雲SDK
以下僅列舉常見SDK在已開啟版本控制的Bucket中下載檔案的程式碼範例。關於其他SDK下載檔案的程式碼範例,請參見SDK簡介。
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;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫不包含Bucket名稱在內的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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourbucketname填寫儲存空間名稱。
bucket: 'yourbucketname'
});
async function get() {
// 檔案名稱。
const result = await client.get('filename', {
// 查看下載檔案的版本ID。
versionId: 'versionid',
});
console.log(result.content);
}
get();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
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內容。
read_content = object_stream.read()
print('get object content:', read_content)
# 查看本次下載的object的版本ID。
print('get object versionid:', object_stream.versionid)
# 由於get_object介面返回的是一個stream流,需要執行read()後才能計算出返回Object資料的CRC checksum,因此需要在調用該介面後做CRC校正。
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() {
/// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填寫儲存空間名稱。
bucket, err := client.Bucket("<yourBucketName>")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
var retHeader http.Header
// 下載yourObjectVersionId版本的檔案到緩衝。
// yourObjectName填寫不包含Bucket名稱在內的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帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 擷取檔案到本地記憶體。*/
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內容。*/
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;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
使用命令列工具ossutil
關於使用ossutil在已開啟版本控制的Bucket中下載檔案的具體操作,請參見cp(下載檔案)。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見GetObject。
刪除檔案
開啟版本控制後,您可以通過指定Object版本ID或者配置Lifecycle將Object永久刪除。如果刪除Object時未指定版本ID,則Bucket中將插入一個刪除標記(Delete Marker)作為目前的版本。
開啟版本控制後,如果刪除Object時未指定版本ID,預設不會刪除Object的目前的版本以及歷史版本。
同一個Bucket請勿同時開通OSS-HDFS服務和版本控制。
如果某個Bucket已同時開通OSS-HDFS服務和版本控制,可能導致OSS-HDFS服務異常。為保證OSS-HDFS服務的穩定性,您需要儘快暫停版本控制,同時配置生命週期規則清理刪除標記。
具體操作,請參見同時開通OSS-HDFS服務和版本控制的Bucket如何處理?。
此外,您還可以在已開啟版本控制的Bucket中通過生命週期規則的Expiration元素指定Object目前的版本到期,還可以通過NoncurrentVersionExpiration元素永久刪除非目前的版本Object,對於這兩種元素的詳細說明如下:
Expiration元素應用於當前Object版本,OSS通過添加刪除標記將目前的版本作為非目前的版本保留,而不是刪除目前的版本Object,然後刪除標記將成為Object的目前的版本。
NoncurrentVersionExpiration元素適用於非目前的版本Object,OSS會永久刪除這些Object版本,且無法恢複永久刪除的Object。
關於版本控制結合生命週期的更多資訊,請參見生命週期配置元素。
以下分別說明在未指定版本ID以及指定版本ID的情況下,執行DELETE操作時Object的刪除行為。
如果未指定Object的版本ID,則OSS會插入一個刪除標記作為目前的版本,該刪除標記也會有相應的唯一版本ID,但沒有相關資料和ACL等,如下圖所示(目前的版本為刪除標記,且版本ID=444444)。
如果指定了Object的版本ID,則永久刪除該指定版本的Object,如下圖所示(即刪除版本ID=333333的Object)。
使用OSS控制台
為了減少儲存費用,建議您及時刪除不再需要的歷史版本Object。
歷史版本Object被刪除後無法恢複,請謹慎操作。
使用阿里雲SDK
以下僅列舉常見SDK在已開啟版本控制的Bucket中刪除指定版本檔案的程式碼範例。關於其他SDK刪除指定版本檔案的程式碼範例,請參見SDK簡介。
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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampledir/object";
String versionId = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
// 建立OSSClient執行個體。
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;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫不包含Bucket名稱在內的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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫儲存空間名稱。
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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# yourObjectName填寫不包含Bucket名稱在內的Object的完整路徑,例如example/test.txt。
object_name = 'yourObjectName'
# 指定Object的versionId,也可以是刪除標記的versionId。
params = dict()
params['versionId'] = 'yourObjectVersionIdOrDeleteMarkerVersionId'
# 刪除指定versionId的Object或指定versionId的刪除標記關聯的Object。
result = bucket.delete_object(object_name, params=params)
print("delete object name: ", object_name)
# 如果指定的是Object的versionId,則返回的delete_marker為None且返回的versionId為指定Object的versionId。
# 如果指定的是刪除標記的versionId,則返回的delete_marker為True且返回的versionId為指定刪除標記的versionId。
if result.delete_marker:
print("delete del-marker versionid: ",result.versionid)
else:
print("delete object versionid:", result.versionid)
using Aliyun.OSS;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// 填寫Object的版本ID或刪除標記的版本ID。
var versionid = "yourObjectVersionidOrDelMarkerVersionid";
// 建立OSSClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 指定Object的versionId,也可以是刪除標記的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() {
/// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourBucketName填寫儲存空間名稱。
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// youObjectName填寫不包含Bucket名稱在內的Object的完整路徑。
// yourObjectVersionId填寫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帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 刪除指定versionId的Object或指定versionId的刪除標記關聯的Object。*/
auto outcome = client.DeleteObject(DeleteObjectRequest(BucketName, ObjectName, "yourObjectVersionIdOrDeleteMarkerVersionId"));
/* 如果指定的是Object的versionId,則返回的delete_marker為None且返回的versionId為指定Object的versionId。*/
/* 如果指定的是刪除標記的versionId,則返回的delete_marker為True且返回的versionId為指定刪除標記的versionId。*/
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "DeleteObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
使用命令列工具ossutil
關於使用ossutil在已開啟版本控制的Bucket中刪除檔案的具體操作, 請參見刪除Object。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見DeleteObject。
恢複檔案
開啟版本控制後,Bucket中Object的所有版本都將得以保留。您可以通過恢複指定歷史版本的方式,使得任意Object的歷史版本成為目前的版本。
您可以通過以下兩種方式將Object的歷史版本恢複至目前的版本:
通過CopyObject來恢複Object的歷史版本
複製的Object將成為該Object的目前的版本,且所有Object版本都將保留。
如下圖所示,將原Object的歷史版本(ID=222222)複製到同一個Bucket中,OSS將為該Object產生新的版本(ID=444444),並將其置為該Object的目前的版本。因此,該Object同時具有歷史版本(ID=222222)以及目前的版本(ID=444444)。
通過刪除Object的目前的版本來恢複Object的歷史版本
如下圖所示,當您通過DELETE versionId的方式永久刪除當前Object版本(ID=222222)後, 下一個歷史版本(ID=111111)成為了該Object的目前的版本。
由於Object的目前的版本刪除後無法恢複,建議您通過CopyObject的方式來恢複Object的歷史版本。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇文件管理>檔案清單。
在檔案清單頁面,單擊歷史版本右側的顯示。
將指定歷史版本的Object恢複為目前的版本。
重要同一個Object僅允許恢複其中的某個歷史版本,且該歷史版本不能為刪除標記。
恢複單個Object
單擊目標歷史版本操作列的恢復。
恢複多個Object
選中目標歷史版本,單擊頁面下方的恢復後,在彈出的對話方塊,單擊確定。
使用阿里雲SDK
以下僅列舉常見SDK在已開啟版本控制的Bucket中拷貝指定版本檔案的程式碼範例。關於其他SDK拷貝指定版本檔案的程式碼範例,請參見SDK簡介。
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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫源Bucket名稱。
String sourceBucketName = "srcexamplebucket";
// 填寫源Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
String sourceObjectName = "srcexampleobject.txt";
// 填寫與源Bucket處於同一地區的目標Bucket名稱。
String destinationBucketName = "desexamplebucket";
// 填寫目標Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
String destinationObjectName = "desexampleobject.txt";
String versionId = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";
// 建立OSSClient執行個體。
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;
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
// 填寫不包含Bucket名稱在內的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填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourbucketname填寫儲存空間名稱。
bucket: 'yourbucketname'
});
// 指定拷貝源Object的versionId。
const versionId = 'versionId';
// 指定拷貝源Object。
const srcObject = 'srcObject.txt';
// 指定拷貝源Bucket。
const srcBucket = 'srcBucket;
// 指定拷貝目標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
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫源Bucket名稱,例如srcexamplebucket。
src_bucket_name = 'srcexamplebucket'
# 填寫與源Bucket處於同一地區的目標Bucket名稱,例如destexamplebucket。
# 當在同一Bucket內拷貝檔案時,請確保源Bucket名稱和目標Bucket名稱相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', dest_bucket_name)
# 填寫源Object完整路徑,完整路徑中不能包含Bucket名稱,例如srcexampledir/exampleobject.txt。
src_object_name = 'srcexampledir/exampleobject.txt'
# 填寫目標Object完整路徑,完整路徑中不能包含Bucket名稱,例如destexampledir/exampleobject.txt。
dest_object_name = 'destexampledir/exampleobject.txt'
# 填寫Object的版本ID。
versionId = 'CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****'
# 拷貝指定版本的檔案。
params = dict()
params['versionId'] = versionId
# 從源Bucket中拷貝一個Object到目標Bucket。
result = bucket.copy_object(src_bucket_name, src_object_name, dest_object_name, params=params)
# 查看返回結果的狀態,如果傳回值為200時,表示執行成功。
print('result.status:', result.status)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫源Bucket名稱。
var sourceBucket = "yourSourceBucketName";
// 填寫源Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
var sourceObject = "yourSourceObjectName";
// 填寫與源Bucket處於同一地區的目標Bucket名稱。
var targetBucket = "yourDestBucketName";
// 填寫目標Object的完整路徑。Object完整路徑中不能包含Bucket名稱。
var targetObject = "yourDestObjectName";
// 填寫Object的版本ID。
var versionid = "yourArchiveObjectVersionid";
// 建立OssClient執行個體。
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模式(即拷貝源檔案的中繼資料),非null則為REPLACE模式(即覆蓋源檔案的中繼資料)。
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帳號資訊。*/
/* 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
/* 填寫源Bucket名稱,例如srcexamplebucket。*/
std::string SourceBucketName = "srcexamplebucket";
/* 填寫與源Bucket處於同一地區的目標Bucket名稱,例如destbucket。*/
std::string CopyBucketName = "destbucket";
/* 填寫源Object的完整路徑,完整路徑中不能包含Bucket名稱,例如srcdir/scrobject.txt。*/
std::string SourceObjectName = "srcdir/scrobject.txt";
/* 填寫目標Object的完整路徑,完整路徑中不能包含Bucket名稱,例如destdir/destobject.txt。*/
std::string CopyObjectName = "destdir/destobject.txt";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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);
/* 填寫源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;
}
/* 釋放網路等資源。*/
ShutdownSdk();
return 0;
}
使用命令列工具ossutil
關於使用ossutil在已開啟版本控制的Bucket中將歷史版本Object恢複為目前的版本Object的具體操作,請參見cp(恢複檔案)。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見CopyObject。