【问题标题】:How to access image by url on s3 using boto3?如何使用boto3通过s3上的url访问图像?
【发布时间】:2018-01-12 06:58:39
【问题描述】:

我想要完成的是生成一个链接来查看文件(ex.image 或 pdf)。该项目无法通过 URL (https://[bucket].s3.amazonaws.com/img_name.jpg) 访问,我认为是因为它是私有的而不是公开的? (我不是bucket的主人,但是他给了我access_key和secret_key?)

目前,我所能做的就是下载一个包含此代码的文件。

s3.Bucket('mybucket').download_file('upload/nocturnes.png', 'dropzone/static/pdf/download_nocturnes.png') 

我想访问 s3 上的图像,以便将其放在 HTML 上,我可以使用访问密钥和密钥查看它吗?感谢那些可以提供帮助的人!

【问题讨论】:

  • 如果检索文件的流量很大,请不要进行这种直接文件检索。
  • @mootmoot 为什么?我应该如何进行检索?
  • 学习使用 CDN 的选项。因为 AWS 对从 AWS 不使用云端的数据传输收取 0.09 美元/GB 的费用。

标签: python amazon-s3 pyramid boto


【解决方案1】:

您可以使用 generate_presigned_url 函数使用预签名 URL 来完成此操作。需要注意的是,预签名的 URL 必须有一个到期日期。我无法找到有关最长允许持续时间的文档。这是一个例子:

url = s3.generate_presigned_url('get_object',
                                Params={
                                    'Bucket': 'mybucket',
                                    'Key': 'upload/nocturnes.png',
                                },                                  
                                ExpiresIn=3600)
print url

【讨论】:

  • 谢谢,这就是我一直在寻找的。我终于可以将图像从 s3 放到我的网站上。但是我有一个新问题,我正在使用 js 库(pdf.js)来查看从亚马逊到我的网站的 pdf 文件。但它会产生一个“跨域请求被阻止:同源策略不允许在.....读取远程资源”,但这是另一个问题,再次感谢。
  • @jordanm 如果您好奇,每个 AWS 区域的最长时间为 604800 秒(7 天)。如果 URL 使用签名版本 2 签名,较旧的地区似乎支持 2038 年之后的到期,但 7 天是适用于任何地方的值。如果对 URL 进行签名的访问密钥 ID 被禁用/删除,则由该密钥签名的任何 URL 也将变得不可用,并且由于访问密钥轮换是最佳做法,因此签名 URL 仅在您的密钥轮换策略允许的情况下持续存在。
【解决方案2】:

对于想要将generate_presigned_url 用于公共对象并因此不想执行附加凭据的签名部分的人,我发现的最佳解决方案是仍然使用generate_presigned_url,只是@ 987654326@需要设置为botocore.UNSIGNED

以下返回没有签名内容的公共链接。

config.signature_version = botocore.UNSIGNED
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key})

关于boto3仓库的相关讨论有:

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2022-10-14
    • 2014-12-07
    • 2018-01-25
    相关资源
    最近更新 更多