使用 Amazon s3 boto 库,如何获取已保存密钥的 URL?
Posted
技术标签:
【中文标题】使用 Amazon s3 boto 库,如何获取已保存密钥的 URL?【英文标题】:Using Amazon s3 boto library, how can I get the URL of a saved key? 【发布时间】:2013-04-15 21:12:04 【问题描述】:我正在保存一个存储桶的密钥:
key = bucket.new_key(fileName)
key.set_contents_from_string(base64.b64decode(data))
key.set_metadata('Content-Type', 'image/jpeg')
key.set_acl('public-read')
保存成功后,如何访问新建文件的URL?
【问题讨论】:
使用虚拟托管样式 S3 url:***.com/a/56090535/1777468 【参考方案1】:如果密钥是公开可读的(如上所示),您可以使用Key.generate_url
:
url = key.generate_url(expires_in=0, query_auth=False)
如果密钥是私有的,并且您想生成一个过期 URL 以与没有直接访问权限的人共享内容,您可以这样做:
url = key.generate_url(expires_in=300)
其中expires
是URL 过期前的秒数。这些将产生 HTTPS 网址。如果您更喜欢 HTTP url,请使用:
url = key.generate_url(expires_in=0, query_auth=False, force_http=True)
【讨论】:
对于 boto 2.9.6,我必须使用expires_in=0
。 expires_in=None
给了我一个错误。
值得注意的是,expires_in=0
是“立即过期!”在博托 2.3.0
如果密钥是公开的(例如,你调用 make_public()), expires_in=0 什么都不做 -> generate_url 生成的 url 永远不会过期。在 boto 2.2.2 中,generate_url(expires_in=None) 会抛出错误,因为尝试将过期日期计算为“expires = int(time.time() + expires_in)”
如果我需要做的只是快速生成链接,我通常会使用S3Connection.generate_url
方法。在此处查看示例:coderwall.com/p/02lxqw
@Seth 该链接指向 boto,而不是 boto3。这个问题是关于boto3的。【参考方案2】:
对于Boto3,你需要通过以下方式来做...
import boto3
s3 = boto3.client('s3')
url = '//'.format(s3.meta.endpoint_url, bucket, key)
【讨论】:
boto3 见***.com/questions/33549254/…【参考方案3】:import boto
from boto.s3.connection import S3Connection
conn = S3Connection('AWS_ACCESS_KEY', 'AWS_SECRET_KEY')
secure_https_url = 'https://host/bucket/key'.format(
host=conn.server_name(),
bucket='name-of-bucket',
key='name_of_key')
http_url = 'http://bucket.host/key'.format(
host=conn.server_name(),
bucket='name-of-bucket',
key='name_of_key')
这就是我在 boto 2.23.0 中为公共 URL 所做的。我无法让 expires_in=None 参数起作用。
请注意,对于 HTTPS,您不能使用子域。
【讨论】:
这很好用,不需要调用 S3 API。也感谢您提供 HTTPS URL。 这里描述的所有方法都不需要调用 S3 API。有些确实需要您安装 boto,如果您链接到的对象可以公开访问,您可以使用上面显示的方法来避免这种情况。 如果存储桶名称仅与有效子域匹配,则可以使用子域:仅小写字母、数字和短划线。在您的示例中,如果存储桶确实是“存储桶名称”,您可以对http_url
使用相同的代码,只需将 https 换成 http。以上是关于使用 Amazon s3 boto 库,如何获取已保存密钥的 URL?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?
如何使 Pyspark 脚本在 Amazon EMR 上运行以识别 boto3 模块?它说找不到模块