You need to enable JavaScript to run this app.
导航

限定条件下载(.NET SDK)

最近更新时间2024.02.04 18:31:07

首次发布时间2023.08.24 14:41:47

TOS .NET SDK 支持设置下载对象的限定条件。您可以在下载对象时,设置下载对象的限制条件(例如对象 ETag 或对象修改时间),当对象信息满足设置的限定条件时服务端才会返回对象数据,否则会返回相应错误。本文介绍如何通过限定条件下载对象。

注意事项

  • 下载对象前,您需要确保账号拥有 tos:GetObject 权限,具体操作,请参见权限配置指南
  • 对于开启多版本的桶,下载指定版本对象时,您必须具有 tos:GetObjectVersion 权限,具体操作,请参见权限配置指南
  • 如果应用程序会在同一时刻大量下载同一个对象,您的访问速度会受到 TOS 带宽及地域的限制。建议您使用 CDN 产品,提升性能的同时也能降低您的成本。通过 CDN 访问 TOS 的详细信息,请参见使用 CDN 加速访问 TOS 资源

限制条件说明

TOS 支持的限定条件如下。

说明

  • 不同条件可以进行组合,例如 If-Modified-Since 和 If-Unmodified-Since 可以同时存在,If-Match 和 If-None-Match 也可以同时存在。
  • 您也可以使用 TOS .NET SDK HeadObject 接口获取对象 Etag 信息。

参数

描述

If-Match

只有当传入的ETag与对象的 ETag相等才返回对象,否则返回 412 Precondition Failed

If-None-Match

只有当传入的ETag与对象的 ETag不相等才返回对象,否则返回 304 Not Modified

If-Modified-Since

只有在对象自指定时间以来被修改过时才返回该对象,否则返回 304 Not Modified

If-Unmodified-Since

只有在对象自指定时间以来未被修改过时才返回该对象,否则返回 412 Precondition Failed

示例代码

以下代码用于限定 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