![](/img/trans.png)
[英]Active Storage public_url not returning key/filename.extension
[英]Google Cloud Storage - getting public URL without knowing specific filename
我有一个 Rails 5.2.3
应用程序托管在 Google Cloud 服务上。 在我的前端,我要求用户上传他们员工的图像,这些图像被保存到 GC 存储桶中,重要的是,对于我的问题,它们以随机名称保存。 有数百个这样的图像,它们基本上都有随机的 40 多个字符串作为存储桶内的名称。
在数据库中,每个用户都有多个员工,每个员工都附有一张图片。
我正在尝试创建一个 Email ,其中我需要为每个用户包含一个特定员工的图像。 现在,我正在使用ActiveStorage::service_url
方法,但问题是service_url
方法将从 GCS 返回一个签名的 URL ,它有一个(默认情况下)5 分钟的 TTL,这意味着图像将在 5 分钟后停止访问分钟和用户得到一个破碎的形象。 该图像最初确实显示得很好,它只是在 5 分钟后过期。
我如何在邮件视图中使用service_url
方法的示例
<%= image_tag (employee.photo.service_url) if employee.photo.attached? %>
Now, the GCS docs state that to get the public URL, you just have to use the BUCKET_NAME/FILE_NAME
URL, but because there's hundreds of these files and they're saved with randomized names (I'm not the one that set that up最初,不要问为什么),我根本没有办法为每个用户以明智的方式做到这一点,特别是因为这是每周 email 发布给每个用户的,表示他们的员工正在执行最好的,所以即使对于一个客户,email 每周都会使用不同的图片。
有什么方法可以让我获得用于这些电子邮件的公共图像 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
您可以根据 URL 设置到期时间:
image_tag(employee.photo.service_url(expires_in: 1.year.to_i))
如果您需要最终到期的资产,max 的答案是一个很好的答案,但我需要一个更持久的解决方案。 事实证明这真的很简单,我不得不调用employee.photo
,而GCS 似乎吐出了一个永久的URL!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.