You need to enable JavaScript to run this app.
文档中心
文档控制台
免费开始使用
对象存储

对象存储

复制全文
下载 pdf
下载对象
限定条件下载(.NET SDK)
复制全文
下载 pdf
限定条件下载(.NET SDK)

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

最近更新时间:2024.02.04 18:31:07
这个页面对您有帮助吗?
有用
有用
无用
无用