ruby-on-rails - 尽管明确设置了无限 TTL,但 Google Cloud Storage 仍为请求的 Assets 设置了到期日期

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

我有一个在 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 和类似的东西,那些不相关

enter image description here

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

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

enter image description here

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

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

相关文章:

google-cloud-platform - Gmail API 无法向 Pub/Sub 平台发布任何消息

ruby-on-rails - rails 型号

ruby-on-rails - 没有属性的验证错误消息

ruby-on-rails - 如何使用 Test::Unit 在一组测试中切换 transactional_fixtures 的使用?

javascript - jqplot 荧光笔工具提示文本重叠

php - 在 google App Engine 中为移动应用程序托管带有 MySQL 的 PHP API。如何?是好是坏?

google-cloud-platform - 无需停机即可将实时域切换到 Google Cloud Run

python - 使用 Blobstore API 和 Images API 在 GAE 中直接从 GCS 提供图像

python - 我需要 objectify.SubElement 的 polyfill

docker - Go 应用程序在 Docker 中挂起