Google 云存储 - 在不知道特定文件名的情况下获取 public URL

Google Cloud Storage - getting public URL without knowing specific filename

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

DB中,每个User有多个Employees,每个Employee有一张图片。

我正在尝试创建一封电子邮件,其中我需要为每个用户包含一个特定员工的图像。现在,我正在使用 ActiveStorage::service_url 方法,但问题是 service_url 方法将 return 来自 GCS 的 Signed URL,它有一个(默认)5分钟的 TTL,这意味着图像将在 5 分钟后停止访问,用户会看到损坏的图像。图片 确实 一开始确实显示正常,它只是在 5 分钟后过期。

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

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

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

我有什么方法可以获取 public 图片 URL 以用于这些电子邮件?

我的storage.yml文件

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

我的 production.rb env 文件

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

我的 Gemfile

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

你可以set the expiry per URL:

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

虽然 max 的回答很好,但如果您需要资产最终到期,我需要一个更永久的解决方案。事实证明这真的很简单,我只需要调用 employee.photo 并且 GCS 似乎会吐出一个永久的 URL!