【问题标题】:How can I access URL of an ActiveStorage attachment at S3?如何在 S3 访问 ActiveStorage 附件的 URL?
【发布时间】:2018-11-05 11:01:58
【问题描述】:

我从回形针迁移到 ActiveStorage,但我在 URL 方面遇到了一些困难。我使用的是service_url,但对我不起作用,因为每次调用该函数时,它都会返回不同的 URL。

我正在尝试使用Rails.application.routes.url_helpers.rails_blob_path。在本地,它有效。我只需要访问http://localhost:3000/rails/active_storage/disk/<etc>,其中rails/active_storage/disk/<etc> 是通过方法调用提供给我的。

但是如何从我的 Amazon S3 访问它?我启用了静态网站托管,但如果我点击http://my-production-bucket.s3-website.sa-east-1.amazonaws.com/rails/active_storage/blobs/<etc>,我会收到错误消息。我打错了端点/错误的主机?我还应该怎么做才能获得一个唯一(非动态)的 URL,还有其他最简单的方法吗?

我的 storage.yml:

amazon:
  service: S3
  access_key_id: <%= ENV['AWS_KEY'] %>
  secret_access_key: <%= ENV['AWS_SECRET'] %>
  region: 'sa-east-1'
  bucket: 'production-bucket'

test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

生产.rb:

config.active_storage.service = :amazon

【问题讨论】:

  • 您遇到什么错误?您的网址很有可能是正确的,并且您没有正确设置公共访问权限
  • 我其实不知道。在设置静态网站托管时,我们需要设置索引和错误页面。当我尝试访问 http://my-production-bucket.s3-website.sa-east-1.amazonaws.com/rails/active_storage/blobs/&lt;etc&gt; 时,我收到错误页面。无论如何,我在 S3 上找不到该路径浏览。这有意义吗?或者它应该有railsactive_storage 之类的文件夹?我尝试创建它们只是为了确保它们是公开的,但仍然没有奏效。

标签: ruby-on-rails amazon-web-services amazon-s3 rails-activestorage


【解决方案1】:

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

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

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

它建议您在您的应用上实施某种代理操作。您为该操作提供固定的 url,然后将请求重定向到当前的 service_url。

【讨论】:

  • 我使用service_url,并开始使用rails_blob_path,因为我不想每次调用该方法时都更新URL。有没有办法使用service_urlurl_for 并且不要不断更改生成的URL?
  • @KilmerLuizAleluia,解决方案是用文档中的引用解释的。您必须定义自定义固定 url,指向每次将请求重定向到实际 service_url 的操作。您可以按照第二段的建议尝试使用url_for(variant),因为看起来 VariantsController 已经处理了该重定向。
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2019-02-18
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多