【问题标题】:Loading images from Google Cloud Storage for Ruby on Rails app on Google App Engine从 Google Cloud Storage 为 Google App Engine 上的 Ruby on Rails 应用程序加载图像
【发布时间】:2021-12-02 06:53:37
【问题描述】:

我有一个使用 Spree/Solidus 核心的 Ruby on Rails Web 应用程序(部署在 Google App Engine 上),它连接到 Google Cloud Storage 以进行文件存储。我们的应用程序有一个管理仪表板,我们可以在其中上传与对象相关的图像,并且我们有一个显示这些图像的网页。当我们最近部署该项目时,这些图像最初会显示,但一段时间后它们就无法显示了! 对于控制台上显示的图像,我们收到以下 400 错误:

Failed to load resource: the server responded with a status of 400 ()

当我们检查管理仪表板时,仍然可以看到相同的图像,但它们在主页上显示为损坏。 我们的 Google Cloud Storage 存储桶具有公共访问权限(尽管我认为它并不真正需要它,因为该应用位于同一个项目中,并且我们部署了 GC_access JSON 文件)。

我们正在使用以下代码来显示图像:

<% if image_url = image.try(:url, size)  %>
  <%= image_tag image_url %>
<% else %>
  <span class="image-placeholder <%= size %>"></span>
<% end %>

我将不胜感激有关尝试解决此问题的任何帮助或建议!我不确定还有哪些其他信息可能会有所帮助,但如果您认为有关某事的更多信息可能会有所帮助,我可以添加更多详细信息。

【问题讨论】:

    标签: ruby-on-rails ruby google-app-engine google-cloud-storage rails-activestorage


    【解决方案1】:

    您可以检查多项内容,以确保正确允许公开分享您的图片。第一个是启用 Bucket Uniform Level Access。这种类型的访问一般适用于存储桶中的所有对象,而不是针对每个对象的 ACL,并且应为 public access 设置对象。接下来要验证的是是否正确创建了图像 URL 以供公众查看,根据documentation,URL 应采用以下格式:

    https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME

    如果您的 URL 包含一长串数据,则可能是您在网站上使用了signed URLs。这些 URL 有一个到期日期,这可以解释为什么它们一开始似乎有效,然后停止向公众展示。在 ActiveStorage documentation 中,它表示 config/storage.yml 文件将默认通过创建签名 URL 进行私有访问:

    默认情况下,Active Storage 假定对服务进行私有访问。这意味着为 blob 生成签名的一次性 URL。如果您希望公开访问 blob,请在应用的 config/storage.yml 中指定 public: true

    这个相关的SO thread 还谈到了 URL 过期和签名 URL。

    【讨论】:

    • 感谢您的回答,这解决了我们的问题!但是我仍然对为什么管理仪表板上的图像很好而不是平台主页上的图像感到困惑。
    猜你喜欢
    • 2011-03-17
    • 2013-06-27
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2019-01-08
    • 2015-07-07
    相关资源
    最近更新 更多