从Google Cloud Storage为Google app Engine上的Ruby on Rails应用程序加载



我有一个Ruby on Rails web应用程序(部署在Google App Engine上)使用Spree/Solidus核心,它连接到Google Cloud Storage用于文件存储。我们有一个管理仪表板为我们的应用程序,我们可以上传图像相关的对象,我们有一个网页,我们显示这些图像。当我们最近部署项目时,图像首先显示,但过了一段时间后它们没有显示!对于控制台显示的图像,我们得到以下400错误:

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

当我们检查管理仪表板时,相同的图像仍然可见,但它们在主页上显示为破碎。我们的谷歌云存储桶有公共访问(虽然我不认为它真的需要它,因为应用程序是在同一个项目上,我们有GC_access JSON文件部署)。

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

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

我将感谢任何帮助或建议,试图解决这个问题!我不确定还有什么信息会有帮助,但如果你认为更多的信息会有所帮助,我可以补充更多的细节。

为了确保你的图片被正确地允许公开分享,你可以检查很多事情。第一个是启用桶统一级别访问。这种类型的访问通常适用于bucket中的所有对象,而不是每个对象的acl,并且应该将对象设置为公共访问。接下来要验证的是是否正确创建了供公众查看的图像url,根据文档,url应该是这样的格式:

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

如果你的URL有一长串数据,那可能是你在你的网站上使用了签名的URL。这些url有一个截止日期,这可以解释为什么它们一开始似乎有效,然后就不再向公众展示了。在ActiveStorage文档中,它说config/storage.yml文件将通过创建签名url默认为私有访问:

默认情况下,Active Storage假定私有访问服务。这意味着为blob生成签名的、一次性使用的url。如果你想让blobs公开访问,在应用的config/storage.yml

中指定public: true

这个相关的SO线程还讨论了url过期和签名url。