Google 尽管明确设置了无限 TTL,云存储仍为请求的资产设置了到期日期

Google Cloud Storage setting an expiry date on requested assets despite explicitly setting infinite TTL

我有一个 Rails 5.2.3 应用 运行 在 Google 云服务上,我有一些用户上传的图像,例如员工图像。这些图像被上传到设置为 public 仅可访问的 GC 存储桶。

我目前的问题是我试图在我们发送的电子邮件中显示这些图像。在电子邮件视图中,图像被调用如下。请注意,员工保证有照片,我们强制用户上传员工照片,因此不存在其中一张照片不存在的风险。

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

现在,这些图片实际上在电子邮件中显示正常... 5 分钟后,图片将无法访问,通过电子邮件中出现的 link 访问图片会将我们带到a 404 文件不再存在。在仔细查看图像 URL 后,我注意到一个参数 Expires= 后跟一个 UNIX 时间戳,转换为电子邮件发送后正好 5 分钟。我搜索了我们 Google 云设置的每一寸,实际上我在任何地方都看不到任何关于 TTL 或过期或任何东西。

这是 url 的图片,因为它很长。我已经编辑了一些项目 ID 和类似的东西,那些不相关

我认为问题是我没有访问存储桶中图像的 public URL, 是永久的,因为它们在文档中说你必须用 BUCKET_NAME/FILE_NAME URL 调用图像,但我不能使用它,因为图像在上传后具有随机文件名,而且它也不是一个非常动态的我们将这些电子邮件发送给每个客户的方法,每个客户都有自己独特的员工和员工图片。

这是存储桶的屏幕截图。如您所见,一切都是Public,手动检查图像,我确实看到了一些我在测试期间看到的员工图像。

任何能为我指出正确方向的信息都将不胜感激。

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

查看您附加的 url,看起来您使用了 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] = ''