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。