OSS支援使用對象標籤(Object Tagging)對儲存空間(Bucket)中的檔案(Object)進行分類,您可以針對相同標籤的Object設定生命週期規則、存取權限等。
關於對象標籤的更多資訊,請參見對象標籤。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS地區和訪問網域名稱。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要設定對象標籤,您必須具有
oss:PutObjectTagging
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
上傳Object時添加對象標籤
以下分別介紹簡單上傳、分區上傳、追加上傳以及斷點續傳上傳情境下為上傳的Object添加對象標籤的樣本。
簡單上傳時添加對象標籤
以下代碼用於簡單上傳時添加對象標籤。
using System.Text; using Aliyun.OSS; using System.Text; using Aliyun.OSS.Util; // 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 bucketName = "examplebucket"; // 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。 var objectName = "exampleobject.txt"; var objectContent = "More than just cloud."; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { byte[] binaryData = Encoding.ASCII.GetBytes(objectContent); MemoryStream requestContent = new MemoryStream(binaryData); var meta = new ObjectMetadata(); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); var putRequest = new PutObjectRequest(bucketName, objectName, requestContent); putRequest.Metadata = meta; // 上傳檔案的同時對檔案設定標籤。 client.PutObject(putRequest); Console.WriteLine("Put object succeeded"); } catch (Exception ex) { Console.WriteLine("Put object failed, {0}", ex.Message); }
分區上傳時添加對象標籤
以下代碼用於分區上傳時添加對象標籤。
using Aliyun.OSS; using Aliyun.OSS.Util; using System.Text; // 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 bucketName = "examplebucket"; // 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。 var objectName = "exampleobject.txt"; // 填寫本地檔案完整路徑,例如D:\\localpath\\examplefile.txt。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。 var localFilename = "D:\\localpath\\examplefile.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); // 初始化分區上傳。 var uploadId = ""; try { // 設定上傳Object及所屬儲存空間的名稱。您可以在InitiateMultipartUploadRequest中設定ObjectMeta,但不必指定ContentLength。 var request = new InitiateMultipartUploadRequest(bucketName, objectName); var meta = new ObjectMetadata(); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; var result = client.InitiateMultipartUpload(request); uploadId = result.UploadId; // 列印UploadId。 Console.WriteLine("Init multi part upload succeeded"); Console.WriteLine("Upload Id:{0}", result.UploadId); } catch (Exception ex) { Console.WriteLine("Init multi part upload failed, {0}", ex.Message); } // 計算分區總數。 var partSize = 100 * 1024; var fi = new FileInfo(localFilename); var fileSize = fi.Length; var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // 開始分區上傳。partETags是儲存partETag的列表,OSS收到您提交的分區列表後,會逐一驗證每個分區資料的有效性。當所有的資料分區通過驗證後,OSS會將這些分區組合成一個完整的檔案。 var partETags = new List<PartETag>(); try { using (var fs = File.Open(localFilename, FileMode.Open)) { for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; // 定位到本次上傳的起始位置。 fs.Seek(skipBytes, 0); // 計算本次上傳的分區大小,最後一個分區為剩餘的資料大小。 var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; // 調用UploadPart介面上傳分區,返回結果中包含了分區的ETag值。 var result = client.UploadPart(request); partETags.Add(result.PartETag); Console.WriteLine("finish {0}/{1}", partETags.Count, partCount); } Console.WriteLine("Put multi part upload succeeded"); } } catch (Exception ex) { Console.WriteLine("Put multi part upload failed, {0}", ex.Message); } // 完成分區上傳。 try { var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var result = client.CompleteMultipartUpload(completeMultipartUploadRequest); Console.WriteLine("complete multi part succeeded"); } catch (Exception ex) { Console.WriteLine("complete multi part failed, {0}", ex.Message); }
追加上傳時添加對象標籤
以下代碼用於追加上傳時添加對象標籤。
using Aliyun.OSS; using Aliyun.OSS.Util; using System.Text; // 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 bucketName = "examplebucket"; // 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。 var objectName = "exampleobject.txt"; // 填寫本地檔案完整路徑,例如D:\\localpath\\examplefile.txt。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。 var localFilename = "D:\\localpath\\examplefile.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); // 第一次追加的位置是0,傳回值為下一次追加的位置。後續追加的位置是追加前檔案的長度。 long position = 0; try { var metadata = client.GetObjectMetadata(bucketName, objectName); position = metadata.ContentLength; } catch (Exception) { } try { using (var fs = File.Open(localFilename, FileMode.Open)) { var request = new AppendObjectRequest(bucketName, objectName) { ObjectMetadata = new ObjectMetadata(), Content = fs, Position = position }; var meta = new ObjectMetadata(); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; // 第一次追加。只有第一次追加上傳時設定的標籤生效。 var result = client.AppendObject(request); // 設定檔案的追加位置。 position = result.NextAppendPosition; Console.WriteLine("Append object succeeded, next append position:{0}", position); } // 擷取追加位置,再次追加檔案。 using (var fs = File.Open(localFilename, FileMode.Open)) { var request = new AppendObjectRequest(bucketName, objectName) { ObjectMetadata = new ObjectMetadata(), Content = fs, Position = position }; var result = client.AppendObject(request); position = result.NextAppendPosition; Console.WriteLine("Append object succeeded, next append position:{0}", position); } } catch (Exception ex) { Console.WriteLine("Append object failed, {0}", ex.Message); }
斷點續傳上傳時添加對象標籤
以下代碼用於斷點續傳上傳時添加對象標籤。
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // 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 bucketName = "examplebucket"; // 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。 var objectName = "exampleobject.txt"; // 填寫本地檔案完整路徑,例如D:\\localpath\\examplefile.txt。如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。 var localFilename = "D:\\localpath\\examplefile.txt"; // 記錄分區上傳結果的檔案。上傳過程中的進度資訊會儲存在該檔案中。 string checkpointDir = "yourCheckpointDir"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { // 通過UploadFileRequest設定多個參數。 UploadObjectRequest request = new UploadObjectRequest(bucketName, objectName, localFilename) { // 指定上傳的分區大小。 PartSize = 8 * 1024 * 1024, // 指定並發線程數。 ParallelThreadCount = 3, // checkpointDir用於記錄本地分區上傳結果的檔案。上傳過程中的進度資訊會儲存在此檔案中,如果某一分區上傳失敗,再次上傳時會根據檔案中記錄的點繼續上傳。如果checkpointDir設定為null,斷點續傳功能不會生效,每次上傳失敗後都會重新上傳。 CheckpointDir = checkpointDir, }; var meta = new ObjectMetadata(); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.Metadata = meta; // 斷點續傳上傳。 client.ResumableUploadObject(request); Console.WriteLine("Resumable upload object:{0} succeeded", objectName); } 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); }
對已上傳Object添加或更改對象標籤
以下代碼用於對已上傳Object添加或更改對象標籤。
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名稱。
var bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
var objectName = "exampleobject.txt";
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();
// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
// 設定標籤資訊。
var setRequest = new SetObjectTaggingRequest(bucketName, objectName);
var tag1 = new Tag
{
Key = "project",
Value = "projectone"
};
var tag2 = new Tag
{
Key = "user",
Value = "jsmith"
};
setRequest.AddTag(tag1);
setRequest.AddTag(tag2);
client.SetObjectTagging(setRequest);
Console.WriteLine("set object tagging succeeded");
}
catch (Exception ex)
{
Console.WriteLine("set object tagging failed. {0}", ex.Message);
}
拷貝Object時設定對象標籤
拷貝Object時,可以指定如何設定目標Object的對象標籤。取值如下:
Copy(預設值):複製源Object的對象標籤到目標Object。
Replace:忽略源Object的對象標籤,直接採用請求中指定的對象標籤。
以下分別提供了簡單拷貝1 GB以下的Object及分區拷貝1 GB以上的Object時設定對象標籤的詳細樣本。
以下代碼用於簡單拷貝1 GB以下的Object時設定對象標籤:
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // 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名稱,例如srcexamplebucket。 var sourceBucket = "srcexamplebucket"; // 填寫源Object的完整路徑,完整路徑中不能包含Bucket名稱,例如srcdir/scrobject.txt。 var sourceObject = "srcdir/scrobject.txt"; // 填寫與源Bucket處於同一地區的目標Bucket名稱,例如destbucket。 var targetBucket = "destbucket"; // 填寫目標Object的完整路徑,完整路徑中不能包含Bucket名稱,例如destdir/destobject.txt。 var targetObject = "destdir/destobject.txt"; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { var metadata = new ObjectMetadata(); metadata.AddHeader("mk1", "mv1"); metadata.AddHeader("mk2", "mv2"); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); metadata.AddHeader("x-oss-tagging", str); var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject) { // 如果NewObjectMetadata為null,則表示Copy模式(即拷貝源檔案的中繼資料);非null則表示Replace模式(即覆蓋源檔案的中繼資料)。 NewObjectMetadata = metadata }; // 拷貝檔案。 client.CopyObject(req); Console.WriteLine("Copy object succeeded"); } 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); }
以下代碼用於分區拷貝1 GB以上的Object時設定對象標籤:
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Util; using System.Text; // 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名稱,例如srcexamplebucket。 var sourceBucket = "srcexamplebucket"; // 填寫源Object的完整路徑,完整路徑中不能包含Bucket名稱,例如srcdir/scrobject.txt。 var sourceObject = "srcdir/scrobject.txt"; // 填寫與源Bucket處於同一地區的目標Bucket名稱,例如destbucket。 var targetBucket = "destbucket"; // 填寫目標Object的完整路徑,完整路徑中不能包含Bucket名稱,例如destdir/destobject.txt。 var targetObject = "destdir/destobject.txt"; var uploadId = ""; var partSize = 50 * 1024 * 1024; String UrlEncodeKey(String key) { const string CharsetName = "utf-8"; const char separator = '/'; var segments = key.Split(separator); var encodedKey = new StringBuilder(); encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName)); for (var i = 1; i < segments.Length; i++) encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName)); if (key.EndsWith(separator.ToString())) { // String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array, // so we have to append all the trailing slash to the uri. foreach (var ch in key) { if (ch == separator) encodedKey.Append(separator); else break; } } return encodedKey.ToString(); } // 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。 const string region = "cn-hangzhou"; // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。 var conf = new ClientConfiguration(); // 設定v4簽名。 conf.SignatureVersion = SignatureVersion.V4; // 建立OssClient執行個體。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); c.SetRegion(region); try { // 初始化拷貝任務。您可以通過InitiateMultipartUploadRequest指定目標檔案中繼資料。 var request = new InitiateMultipartUploadRequest(targetBucket, targetObject); var meta = new ObjectMetadata(); // 在HTTP header中設定標籤資訊。 string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2"); meta.AddHeader("x-oss-tagging", str); request.ObjectMetadata = meta; var result = client.InitiateMultipartUpload(request); // 列印uploadId。 uploadId = result.UploadId; Console.WriteLine("Init multipart upload succeeded, Upload Id: {0}", result.UploadId); // 計算分區數。 var metadata = client.GetObjectMetadata(sourceBucket, sourceObject); var fileSize = metadata.ContentLength; var partCount = (int)fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } // 開始分區拷貝。 var partETags = new List<PartETag>(); for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); // 建立UploadPartCopyRequest並通過UploadPartCopyRequest指定限定條件。 var uploadPartCopyRequest = new UploadPartCopyRequest(targetBucket, targetObject, sourceBucket, sourceObject, uploadId) { PartSize = size, PartNumber = i + 1, // BeginIndex用來定位此次上傳分區開始所對應的位置。 BeginIndex = skipBytes }; // 調用uploadPartCopy方法來拷貝每一個分區。 var uploadPartCopyResult = client.UploadPartCopy(uploadPartCopyRequest); Console.WriteLine("UploadPartCopy : {0}", i); partETags.Add(uploadPartCopyResult.PartETag); } // 完成分區拷貝。 var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(targetBucket, targetObject, uploadId); // partETags為分區上傳中儲存的partETag的列表,OSS收到使用者提交的此列表後,會逐一驗證每個資料分區的有效性。全部驗證通過後,OSS會將這些分區合成一個完整的檔案。 foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest); Console.WriteLine("CompleteMultipartUpload succeeded"); } 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); }
為軟連結檔案設定標籤
以下代碼用於為軟連結檔案設定對象標籤。
using Aliyun.OSS;
using Aliyun.OSS.Util;
using System.Text;
// 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 bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
var targetObjectName = "exampleobject.txt";
// 填寫軟連結名稱,例如symlink.txt。
var symlinkObjectName = "symlink.txt";
var objectContent = "More than just cloud.";
String UrlEncodeKey(String key)
{
const string CharsetName = "utf-8";
const char separator = '/';
var segments = key.Split(separator);
var encodedKey = new StringBuilder();
encodedKey.Append(HttpUtils.EncodeUri(segments[0], CharsetName));
for (var i = 1; i < segments.Length; i++)
encodedKey.Append(separator).Append(HttpUtils.EncodeUri(segments[i], CharsetName));
if (key.EndsWith(separator.ToString()))
{
// String#split ignores trailing empty strings, e.g., "a/b/" will be split as a 2-entries array,
// so we have to append all the trailing slash to the uri.
foreach (var ch in key)
{
if (ch == separator)
encodedKey.Append(separator);
else
break;
}
}
return encodedKey.ToString();
}
// 填寫Bucket所在地區對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
var conf = new ClientConfiguration();
// 設定v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 建立OssClient執行個體。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
// 上傳目標檔案。
byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
MemoryStream requestContent = new MemoryStream(binaryData);
client.PutObject(bucketName, targetObjectName, requestContent);
var meta = new ObjectMetadata();
// 在HTTP header中設定標籤資訊。
string str = UrlEncodeKey("key1") + "=" + UrlEncodeKey("value1") + "&" + UrlEncodeKey("key2") + "=" + UrlEncodeKey("value2");
meta.AddHeader("x-oss-tagging", str);
var request = new CreateSymlinkRequest(bucketName, symlinkObjectName, targetObjectName);
request.ObjectMetadata = meta;
// 建立軟連結。
client.CreateSymlink(request);
// 擷取軟連結指向的目標檔案名稱。
var ossSymlink = client.GetSymlink(bucketName, symlinkObjectName);
Console.WriteLine("Target object is {0}", ossSymlink.Target);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
相關文檔
關於設定對象標籤的API介面說明,請參見PutObjectTagging。