使用Amazon S3 Boto库,如何获取已保存键的URL?

54

我正在使用以下代码将一个键保存到桶中:

    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?


1
使用虚拟托管样式的S3 URL:https://dev59.com/questions/2FYM5IYBdhLWcg3wnBFY#56090535 - lionels
3个回答

98

如果密钥为公共可读(如上所示),则可以使用Key.generate_url

url = key.generate_url(expires_in=0, query_auth=False)
如果密钥是私有的,并且您想生成一个过期的URL,与某个没有直接访问权限的人分享内容,您可以执行以下操作:
url = key.generate_url(expires_in=300)

其中 expires 是 URL 过期前的秒数。这些将生成 HTTPS URL。如果您想要 HTTP URL,请使用以下方式:

url = key.generate_url(expires_in=0, query_auth=False, force_http=True)

13
使用Boto 2.9.6版本时,我必须使用expires_in=0。而expires_in=None会导致错误。 - Dirk
5
值得注意的是,在boto 2.3.0中,expires_in=0表示“立即过期!” - Dragon Dave
3
如果密钥是公开的(例如,您调用make_public()函数),则expires_in=0没有作用 -> generate_url生成的URL永远不会过期。在boto 2.2.2中,generate_url(expires_in=None)会抛出错误,因为它试图计算到期日期为“expires = int(time.time()+ expires_in)”。 - Alberto Megía
如果我只需要快速生成链接,我通常会使用S3Connection.generate_url方法。可以在此处查看示例:https://coderwall.com/p/02lxqw。 - Seth
3
@Seth,那个链接是关于boto而不是boto3的。这个问题是关于boto3的。 - dsjoerg

31

对于Boto3,您需要按照以下方式进行...

import boto3

s3 = boto3.client('s3')
url = '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key)

1
有关boto3的详细信息,请参阅https://dev59.com/MlwX5IYBdhLWcg3wpw5h。 - Mark Chackerian

8
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。 - Seth
1
这里描述的方法都不需要调用S3 API。有些方法需要安装boto,如果你要链接的对象是公开可访问的,你可以通过使用上面展示的方法来避免这个问题。 - garnaat
如果存储桶名称与有效子域名匹配,您可以使用子域名。仅限使用小写字母、数字和破折号。在您的示例中,如果存储桶真的是“name-of-bucket”,您可以将相同的代码用于 http_url,只需将 https 替换为 http。 - Jordan Reiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接