TOS .NET SDK 支持设置下载对象的限定条件。您可以在下载对象时,设置下载对象的限制条件(例如对象 ETag 或对象修改时间),当对象信息满足设置的限定条件时服务端才会返回对象数据,否则会返回相应错误。本文介绍如何通过限定条件下载对象。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请参见权限配置指南。TOS 支持的限定条件如下。
说明
参数 | 描述 |
---|---|
If-Match | 只有当传入的 |
If-None-Match | 只有当传入的 |
If-Modified-Since | 只有在对象自指定时间以来被修改过时才返回该对象,否则返回 |
If-Unmodified-Since | 只有在对象自指定时间以来未被修改过时才返回该对象,否则返回 |
以下代码用于限定 If-Modified-Since 和 IfUnmodifiedSince 条件下载对象。
using System; using System.IO; using TOS; using TOS.Error; using TOS.Model; namespace ConsoleApp { internal class Program { private static void Main(string[] args) { var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY"); var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY"); // endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS // Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com var endpoint = "https://tos-cn-beijing.volces.com"; var region = "cn-beijing"; // 填写 BucketName var bucketName = "*** Provide your bucket name ***"; // 下载对象 var objectKey = "example_dir/example.txt"; var date = new DateTime(2022, 10, 24, 0, 0, 0, DateTimeKind.Utc); // 创建TOSClient实例 var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build(); // 指定IfModifiedSince 作为下载条件 try { var getObjectInput = new GetObjectInput { Bucket = bucketName, Key = objectKey, IfModifiedSince = date }; var getObjectOutput = client.GetObject(getObjectInput); // 满足限定条件时,读取对象 using (var reader = new StreamReader(getObjectOutput.Content)) { Console.WriteLine("GetObject succeeded, content {0}", reader.ReadToEnd()); getObjectOutput.Content.Close(); } } catch (TosServerException ex) { // IfModifiedSince 不满足时,返回 304 if (ex.StatusCode == 304) { Console.WriteLine("Object not modify, request id {0}", ex.RequestID); } else { Console.WriteLine("GetObject failed, request id {0}", ex.RequestID); Console.WriteLine("GetObject failed, status code {0}", ex.StatusCode); Console.WriteLine("GetObject failed, response error code {0}", ex.Code); Console.WriteLine("GetObject failed, response error message {0}", ex.Message); } } catch (TosClientException ex) { Console.WriteLine("GetObject failed, error message {0}", ex.Message); } catch (Exception ex) { Console.WriteLine("GetObject failed, {0}", ex.Message); } // 指定IfUnmodifiedSince 作为下载条件 try { var getObjectInput = new GetObjectInput { Bucket = bucketName, Key = objectKey, IfUnmodifiedSince = date }; var getObjectOutput = client.GetObject(getObjectInput); // 满足限定条件时,读取对象 using (var reader = new StreamReader(getObjectOutput.Content)) { Console.WriteLine("GetObject succeeded, content {0}", reader.ReadToEnd()); getObjectOutput.Content.Close(); } } catch (TosServerException ex) { // IfUnmodifiedSince 不满足时,返回 412 if (ex.StatusCode == 412) { Console.WriteLine("Object modify, request id {0}", ex.RequestID); } else { Console.WriteLine("GetObject failed, request id {0}", ex.RequestID); Console.WriteLine("GetObject failed, status code {0}", ex.StatusCode); Console.WriteLine("GetObject failed, response error code {0}", ex.Code); Console.WriteLine("GetObject failed, response error message {0}", ex.Message); } } catch (TosClientException ex) { Console.WriteLine("GetObject failed, error message {0}", ex.Message); } catch (Exception ex) { Console.WriteLine("GetObject failed, {0}", ex.Message); } } } }
关于限定条件下载的 API 接口详细介绍,请参见 GetObject。