问题描述
默认情况下,所有存储桶和对象都是私有的,如何允许没有凭证的客户/用户将对象上传到桶或者从桶中下载对象
问题分析
预签名URL是一种持有者令牌,可向拥有这些URL的客户授予访问权限,我们可以通过预签名URL来实现
解决方案
本文将使用TOS python SDK 实现上传跟下载,先生成预签名URL,然后再使用生成的预签名URL进行上传/下载,具体如下
使用presign url进行对象上传
创建预签名 URL 时,您必须提供安全凭证,然后指定一个存储桶名称、一个对象键、一个 HTTP 方法(对上传对象执行 PUT 操作)和一个截止日期和时间。
1、生成预签名URL
import tos
ak = "xxxxxx" # 修改实际AK
sk = "xxxxxx" # 修改为实际SK
endpoint = "tos-cn-beijing.volces.com"
region = 'cn-beijing'
bucket = "xxxx" # 修改为实际桶名
key = "a.sh" # 要上传的对象名
client = tos.TosClient(tos.Auth(ak, sk, region), endpoint)
url = client.generate_presigned_url(Method='PUT', Bucket=bucket, Key=key, ExpiresIn=86400)
# print the url
print(url)
2、客户端使用request构造post请求通过presign_url上传对象
import requests
url = "http://xxxx.tos-cn-beijing.volces.com/a.sh?X-Tos-Algorithm=TOS4-HMAC-SHA256&X-Tos-Credential=xxxxxx%2Fcn-beijing%2Ftos%2Frequest&X-Tos-Date=20211203T065244Z&X-Tos-Expires=86400&X-Tos-SignedHeaders=host&X-Tos-Signature=xxxxxx" # 步骤1中生成的url
object_name = "/root/TOS/a.sh" # 要上传对象的路径
with open(object_name,'rb') as f:
http_rsp = requests.put(url,data=f)
print(http_rsp)
print(http_rsp.content)
3、查看桶中对象是否上传成功
使用预签名URL下载
当为对象创建预签名的 URL 时,必须提供安全凭证、指定存储桶名称和对象键、指定 HTTP 方法(指定为 GET 以下载对象)和过期日期和时间。
1、生成预签名URL
import tos
import sys
ak = "xxxxxx"
sk = "xxxxxx"
endpoint = "tos-cn-beijing.volces.com"
region = 'cn-beijing'
bucket = "xxxx"
key = "a.sh"
client = tos.TosClient(tos.Auth(ak, sk, region), endpoint)
url = client.generate_presigned_url(Method='GET', Bucket=bucket, Key=key, ExpiresIn=86400)
print(url)
2、使用上面步骤生成的URL进行下载,直接复制到浏览器或者使用wget、curl等客户端工具。
如果您有其他问题,欢迎您联系火山引擎技术支持服务