Google Cloud Storage - 在不知道特定文件名的情况下获取公共 URL

时间:2020-12-29 12:24:24

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

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

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

我正在尝试创建一封电子邮件,我需要在其中为每个用户包含一个特定员工的图像。现在,我正在使用 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)

我的 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

2 个答案:

答案 0 :(得分:1)

您可以set the expiry per URL

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

答案 1 :(得分:0)

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

相关问题