TOS中如何使用预签名URL上传/下载对象

问题描述

默认情况下,所有存储桶和对象都是私有的,如何允许没有凭证的客户/用户将对象上传到桶或者从桶中下载对象

问题分析

预签名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等客户端工具。

如果您有其他问题,欢迎您联系火山引擎技术支持服务

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论