【问题标题】:Permanent URL of ActiveStorage objects in S3S3 中 ActiveStorage 对象的永久 URL
【发布时间】:2021-05-23 00:36:07
【问题描述】:

我有一个名为Campaign 的模型,每个Campaign 都有一个附件。

我使用 S3 ActiveStorage 存储,我的Campaign 图像需要一个永久 URL。

我目前生成的 URL 如下:

campaign.image.service_url

但此链接将在 5 分钟后过期。我需要非过期链接。 (配置设置只能让我得到一个1周后过期的网址,它并没有再次解决我的问题)

如何获取图片的 URL?

编辑

解决方案:

我使用 CloudFront 作为 CDN。这是我找到的解决方案:

https://domainName+/campaign.image.key

这提供了一个指向不会过期的图像文件的链接。

【问题讨论】:

    标签: ruby-on-rails amazon-s3


    【解决方案1】:

    查看文档https://api.rubyonrails.org/classes/ActiveStorage/Variant.html#method-i-service_url

    你不应该直接暴露service_url

    返回服务变体的 URL。为了安全起见,此 URL 旨在短期使用,不直接用于用户。相反,service_url 应该只作为来自稳定的、可能经过身份验证的 URL 的重定向公开。将 service_url 隐藏在重定向后面还可以让您在不更新所有 URL 的情况下更改服务。它允许将重定向到 service_url 的永久 URL 缓存在视图中。

    使用 url_for(variant)(或隐含的形式,如 +link_to variant+ 或 +redirect_to variant+)来获取指向 ActiveStorage::RepresentationsController 的变体的稳定 URL,而 ActiveStorage::RepresentationsController 反过来将使用此 service_call 方法进行重定向。

    所以请改用url_for(campaign.image)(或url_for(campaign.image.some_variant))。

    【讨论】:

    • 我收到了类似 undefined method `url_for' 的错误信息。我该如何解决这个问题?
    【解决方案2】:

    不过期的网址很简单,没有任何参数:

    http[s]://[bucket-name.s3].amazonaws.com/pathtofile/file.extention
    

    您可以使用 S3::Objects :public_url 方法从 AWS 开发工具包中获取此 URL

    【讨论】:

    • 如何获取文件路径?
    • 我不能将它应用到我的情况:(我在另一个模型中调用campaign.image。所以我需要在不同模型中使用这个URL自定义方法。我该如何使用public_url?
    猜你喜欢
    • 2020-07-06
    • 2020-03-16
    • 2018-09-06
    • 2019-02-25
    • 1970-01-01
    • 2015-01-08
    • 2017-02-27
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多