若您想在下载对象时,设置下载对象的限制条件(对象 ETag 或对象修改时间),您可使用 TOS Python SDK 提供的限定条件下载功能,当对象信息满足您指定条件时才下载对象。本文介绍如何通过限定条件下载对象。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请参见权限配置指南。TOS 支持的限定条件如下。
参数 | 描述 | 如何设置 |
---|---|---|
If-Match | 只有当传入的 | if_match |
If-Modified-Since | 只有在对象自指定时间以来被修改过时才返回该对象,否则返回304 Not Modified。 | if_modified_since |
If-None-Match | 只有当传入的 | if_none_match |
If-Unmodified-Since | 只有在对象自指定时间以来未被修改过时才返回该对象,否则返回412 Precondition Failed。 | if_unmodified_since |
以下代码用于限定条件下载桶 bucket-test
中对象 object-test
。
import datetime import os import tos # 从环境变量获取 AK 和 SK 信息。 ak = os.getenv('TOS_ACCESS_KEY') sk = os.getenv('TOS_SECRET_KEY') endpoint = "your endpoint" region = "your region" bucket_name = "bucket-test" # 对象名称,例如 example_dir 下的 example_object.txt 文件,则填写为 example_dir/example_object.txt object_key = "object-test" # 创建 TosClientV2 对象,对桶和对象的操作都通过 TosClientV2 实现 client = tos.TosClientV2(ak, sk, endpoint, region) try: # 如果 if_modified_since=date 指定的时间早于Object实际修改时间,则正常下载Object,否则返回错误304 Not modified。 date = datetime.datetime(2020, 12, 20) client.get_object(bucket_name, object_key, if_modified_since=date) # 如果if_unmodified_since指定的时间等于或者晚于Object实际修改时间,则正常下载Object,否则返回错误412 Precondition failed。 date = datetime.datetime(2100, 12, 20) client.get_object(bucket_name, object_key, if_unmodified_since=date) # 如果传入的ETag和Object的ETag匹配,则正常下载Object,否则返回错误412 Precondition failed。 etag = client.head_object(bucket_name, object_key).etag client.get_object(bucket_name, object_key, if_match=etag) # 如果if_none_match传入的ETag和Object的ETa不g匹配,则正常下载Object,否则返回错误304 Not modified。 etag = 'DC21493F505BA3739562D8CC452C****' client.get_object(bucket_name, object_key, if_none_match=etag) except tos.exceptions.TosServerError as e: # 不满足限定条件查询时,直接抛出 TosServerError 可通过e.status_code查看http状态码 print('http err code', e.status_code) print('message', e.message) print('error with ec: {}'.format(e.ec)) print('error with request url: {}'.format(e.request_url)) except Exception as e: print(e)
关于下载对象的 API 文档,请参见 GetObject。