Python 3 Boto 3、AWS S3:获取对象 URL

新手上路,请多包涵

我需要在上传文件后直接检索公共对象 URL,以便能够将其存储在数据库中。这是我的上传代码:

    s3 = boto3.resource('s3')
   s3bucket.upload_file(filepath, objectname, ExtraArgs={'StorageClass': 'STANDARD_IA'})

我不是在寻找预签名的 URL,而是始终可以通过 https 公开访问的 URL。

任何帮助表示赞赏。

原文由 HyperDevil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

没有简单的方法,但您可以从存储桶所在的区域 ( get_bucket_location )、存储桶名称和存储密钥构造 URL:

 bucket_name = "my-aws-bucket"
key = "upload-file"

s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
bucket.upload_file("upload.txt", key)
location = boto3.client('s3').get_bucket_location(Bucket=bucket_name)['LocationConstraint']
url = "https://s3-%s.amazonaws.com/%s/%s" % (location, bucket_name, key)

原文由 ofrommel 发布,翻译遵循 CC BY-SA 3.0 许可协议

自 2010 年以来,您可以使用虚拟托管样式的 S3 url,即无需弄乱特定于区域的 url:

 url = f'https://{bucket}.s3.amazonaws.com/{key}'

使用引号键:

 url = f'''https://{bucket}.s3.amazonaws.com/{urllib.parse.quote(key, safe="~()*!.'")}'''

此外,对于在 2020 年 9 月 30 日或之前创建的存储桶,继续支持路径样式模型(区域特定 URL)。 在该日期之后创建的存储桶必须使用虚拟托管模型进行引用

另请参阅此 博客文章

原文由 lionels 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题