我有一个在 Google Cloud 服务上运行的 Rails 5.2.3
应用程序,我有一些用户上传的图像,例如员工图像。这些图像被上传到 GC 存储桶中,设置为可公开访问。
我当前的问题是我试图在我们发送的电子邮件中显示这些图像。在电子邮件 View 中,图像被调用如下。请注意,员工保证有照片,我们强制用户上传员工照片,因此不存在其中一张照片不存在的风险。
<%= image_tag (employee.photo.service_url) if employee.photo.attached? %>
现在,图片实际上在电子邮件中正常显示... 5 分钟后,图片将无法访问,通过电子邮件中的链接访问图片会将我们带到 404
文件不再存在。仔细查看图像 URL 后,我注意到一个参数,Expires=
,后跟一个 UNIX 时间戳,转换为电子邮件发送后的 5 分钟。我仔细检查了 Google Cloud 设置的每一寸,几乎没有看到任何关于 TTL 或过期时间或任何东西的信息。
这是 url 的图片,因为它很长。我已经编辑了一些项目 ID 和类似的东西,那些不相关
我认为问题在于我没有访问存储桶中图像的公共(public) URL,该存储桶将是永久的,正如他们在文档中所说,您必须使用BUCKET_NAME/FILE_NAME
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
最佳答案
查看您附加的网址,看起来您使用了 signed URL .
如果我的猜测是正确的,你可以在你的参数上指定过期时间。
引用here获取有关如何指定过期参数的详细信息。
它描述了示例 python 代码,但您可以自己调整它。
下面是部分示例代码,我想这就是你想要的。
if query_parameters is None:
query_parameters = dict()
query_parameters['X-Goog-Algorithm'] = 'GOOG4-RSA-SHA256'
query_parameters['X-Goog-Credential'] = credential
query_parameters['X-Goog-Date'] = request_timestamp
query_parameters['X-Goog-Expires'] = expiration
query_parameters['X-Goog-SignedHeaders'] = signed_headers
if subresource:
query_parameters[subresource] = ''
关于ruby-on-rails - 尽管明确设置了无限 TTL,但 Google Cloud Storage 仍为请求的 Assets 设置了到期日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65478492/