使用 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=0expires_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?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 boto:如何重命名存储桶中的文件?

如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?

如何使 Pyspark 脚本在 Amazon EMR 上运行以识别 boto3 模块?它说找不到模块

如何在 boto S3 中获取文件/密钥大小?

使用 Python 和 Boto3 获取列表集群 Amazon Redshift

如何使用 boto3 将 S3 对象保存到文件中