【问题标题】:Google Cloud Storage - getting public URL without knowing specific filenameGoogle Cloud Storage - 在不知道特定文件名的情况下获取公共 URL
【发布时间】:2021-04-06 01:54:47
【问题描述】:

我有一个 Rails 5.2.3 应用程序托管在 Google Cloud 服务上。在我的前端,我要求用户上传他们员工的图片,这些图片会保存到 GC 存储桶中,重要的是,对于我的问题,它们是用随机名称保存的。有数百张这样的图像,它们基本上都有随机 40 多个字符串作为存储桶内的名称。

在数据库中,每个用户都有多个员工,每个员工都附有一张图片。

我正在尝试创建一封电子邮件,我需要在其中为每个用户添加一个特定员工的图像。现在,我正在使用ActiveStorage::service_url 方法,但问题是service_url 方法将从GCS 返回一个Signed URL,它具有(默认情况下)5 分钟的TTL,这意味着图像将无法访问5 分钟后,用户得到一个损坏的图像。图片确实最初显示很好,只是在 5 分钟后过期。

我如何在邮件视图中使用service_url 方法的示例

<%= image_tag (employee.photo.service_url) if employee.photo.attached? %>

现在,GCS 文档声明要获取公共 URL,您只需要使用 BUCKET_NAME/FILE_NAME URL,但是因为有数百个这样的文件并且它们以随机名称保存(我不是那个最初设置它,不要问为什么),我根本没有办法为每个用户以明智的方式做到这一点,特别是因为这是每周发送给每个用户的电子邮件,表示他们的员工表现最好的,因此即使对于一个客户,电子邮件也会每周使用不同的图片。

我有什么方法可以获取用于这些电子邮件的公共图像 URL?

我的storage.yml 文件

google:
  service: GCS
  project: REDACTED
  credentials: <%= Rails.application.credentials.gcs_storage_credentials.to_json %>
  bucket: images-REDACTED

我的production.rb 环境文件

config.active_storage.service = :google
config.action_mailer.asset_host = Rails.application.credentials.send(production_server_url)

我的宝石文件

ruby '2.6.3'
gem 'rails', '~> 5.2.3'
gem 'pg', '>= 0.18', '< 2.0'
gem 'active_storage_base64'
gem 'google-cloud-storage', '~> 1.8', require: false

【问题讨论】:

  • @max 不幸的是,我在 Rails 5.2.3 上,它不支持 Blob::url 方法(除非我错了,调用 employee.photo.url 会返回 undefined method 错误)跨度>
  • service_url 应该有签名,所以你应该能够使用service_url(expires_in: 1.year.to_i)api.rubyonrails.org/v5.2.4.4/classes/ActiveStorage/…
  • @max 美丽,成功了!不过看起来有点笨拙,走这条路有什么缺点吗?您可能应该将其发布为答案,以便我将其标记为正确
  • 我想不出任何特别的事情。在旁注中,您不应该在方法名称和括号之间放置空格,如image_tag (employee.photo.service_url)。由于括号在 ruby​​ 中是可选的,它实际上被评估为 image_tag((employee.photo.service_url)) - 如果你添加一个额外的参数,你会得到一个语法错误。

标签: ruby-on-rails google-app-engine google-cloud-platform google-cloud-storage rails-activestorage


【解决方案1】:

你可以set the expiry per URL:

image_tag(employee.photo.service_url(expires_in: 1.year.to_i))

【讨论】:

    【解决方案2】:

    如果您需要最终到期的资产,虽然 max 的答案是一个很好的答案,但我需要一个更持久的解决方案。原来它真的很简单,我不得不打电话给employee.photo,而 GCS 似乎吐出了一个永久 URL!

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 2020-03-24
      • 2021-04-10
      • 1970-01-01
      • 2021-12-03
      • 2014-11-14
      • 2017-07-08
      • 1970-01-01
      相关资源
      最近更新 更多