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
image_tag(employee.photo.service_url(expires_in: 1.year.to_i))
虽然 max 的回答很好,但如果您需要资产最终到期,我需要一个更永久的解决方案。事实证明这真的很简单,我只需要调用 employee.photo
并且 GCS 似乎会吐出一个永久的 URL!
我有一个 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
image_tag(employee.photo.service_url(expires_in: 1.year.to_i))
虽然 max 的回答很好,但如果您需要资产最终到期,我需要一个更永久的解决方案。事实证明这真的很简单,我只需要调用 employee.photo
并且 GCS 似乎会吐出一个永久的 URL!