Python 3.x 在python中为S3文件夹创建预签名url

Python 3.x 在python中为S3文件夹创建预签名url,python-3.x,amazon-web-services,url,amazon-s3,boto3,Python 3.x,Amazon Web Services,Url,Amazon S3,Boto3,我正在尝试生成一个S3文件夹(它本身包含更多的文件夹/文件)的预签名url,并在我的客户端之间分发它,以便他们可以下载它的内容。i、 e.通过单击链接,用户将文件夹下载到其本地磁盘 但是,在XML对话中,我不断遇到“没有这样的键”错误 我正在从boto3 sdk使用client.generate_presigned_url() def create_presigned_url(bucket,object): 尝试: url=s3\u client.generate\u presigned\u u

我正在尝试生成一个S3文件夹(它本身包含更多的文件夹/文件)的预签名url,并在我的客户端之间分发它,以便他们可以下载它的内容。i、 e.通过单击链接,用户将文件夹下载到其本地磁盘

但是,在XML对话中,我不断遇到“没有这样的键”错误

我正在从boto3 sdk使用client.generate_presigned_url()

def create_presigned_url(bucket,object):
尝试:
url=s3\u client.generate\u presigned\u url(
“获取对象”,
Params={
“桶”:桶,
“键”:对象
},
ExpiresIn=240,
HttpMethod='GET'
)
除ClientError作为e外:
打印(e)
一无所获
返回url
这是错误消息:

此XML文件似乎没有任何与之关联的样式信息。文档树如下所示。
NoSuchKey
指定的密钥不存在。
输出/BARNES/070419/APR19BAR/
E6BE736FE945FA22
hk3+d+***************************************************************************************************+EO2CZmo=
S3没有“文件夹”的概念。实际上,您在这里要做的是创建一个预先签名的url,而这也是不可能的。如果您必须为多个文件共享单个url,则需要将它们压缩到单个对象中,然后使用预先签名的url共享该对象的密钥

导入boto3
s3_client=boto3.client(
“s3”,
region\u name='your\u region\u name',
aws\u access\u key\u id='您的aws\u access\u key\u id',
aws\u secret\u access\u key='your\u aws\u access\u key\u id',
)
#只需指定文件夹名称:
url=s3\u client.generate\u presigned\u url(
ClientMethod='put_object',
Params={'Bucket':'your_Bucket_name','Key':'folder_name/file_name.txt',},
ExpiresIn=60,
)

生成的URL将在一周后过期

由于AWS有限制:您最多可以保留一周的链接。
这大约是600000秒(请参见
中的
过期)

def create_presigned_url(bucket,object):
尝试:
bucket\u name=bucket
ACCESS\u KEY=“ACCESS\u KEY”
SECRET\u KEY=“SECRET\u KEY”
键=对象
location=boto3.client('s3',aws\u access\u key\u id=access\u key,aws\u secret\u access\u key=secret\u key)。获取bucket\u位置(bucket=bucket\u name)['LocationConstraint']
s3_client=boto3.client(
“s3”,
区域名称=位置,
aws\u访问密钥\u id=访问密钥,
aws_secret_access_key=secret_key,
)
url=s3\u client.generate\u presigned\u url(
ClientMethod='get_object',
Params={'Bucket':Bucket_name,'Key':Key,},
ExpiresIn=600000,
)
除ClientError作为e外:
打印(e)
一无所获
返回url

您的
对象
变量必须是单个S3对象的键。正如下面的答案所示,“文件夹”在S3中不是一个真正的对象,它只是实际文件密钥的一部分。虽然这听起来很有希望,但我不想保存同一数据的两个副本。预先签名的URL只适用于单个对象。因此,如果您希望用户能够下载多个对象,则必须尝试其他方法。