Heroku、Shrine 和 Amazon S3:博客文章图像在一段时间后消失

2024-01-27

我有一个使用 Rails 5.1 开发的博客页面。一切工作正常,除了在我在制作中创建帖子并附加图像后,图像在一段时间(例如 30 分钟)后停止显示。我在互联网上寻找解决方案并看到this https://shrinerb.com/rdoc/classes/Shrine/Storage/FileSystem.html这表明问题与 Heroku 在每次应用程序重新启动后擦除目录有关。提供的一种解决方案是将图像托管在 Amazon S3 等服务上。

I have however set S3 up and the images are being sent to the bucket shown below: enter image description here

但博客文章图像仍然消失。我需要帮助,因为我无法弄清楚我缺少什么。以下是相关代码:

神社.rb:

require "shrine"
require "shrine/storage/s3"
s3_options = {
    access_key_id:      ENV['S3_KEY'],
    secret_access_key:  ENV['S3_SECRET'],
    region:             ENV['S3_REGION'],
    bucket:             ENV['S3_BUCKET'],
}

if Rails.env.development?
  require "shrine/storage/file_system"
  Shrine.storages = {
    cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"), # temporary
    store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store")  # permanent
  }
elsif Rails.env.test?
  require 'shrine/storage/memory'
  Shrine.storages = {
    cache: Shrine::Storage::Memory.new,
    store: Shrine::Storage::Memory.new
  }
else
  require "shrine/storage/s3"

  Shrine.storages = {
    cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options),
    store: Shrine::Storage::S3.new(prefix: "store", **s3_options)
  }
end
Shrine.plugin :activerecord # or :activerecord
Shrine.plugin :cached_attachment_data # for retaining the cached file across form redisplays

gemfile:

....................................
# A rich text editor for everyday writing
gem 'trix', '~> 0.11.1'
# a toolkit for file attachments in Ruby applications
gem 'shrine', '~> 2.11'
# Tag a single model on several contexts, such as skills, interests, and awards
gem 'acts-as-taggable-on', '~> 6.0'
# frameworks for multiple-provider authentication.
gem 'omniauth-facebook'
gem 'omniauth-github'
# Simple Rails app key configuration
gem "figaro"
..............................

我使用 Figaro gem 来屏蔽 env 文件。它们很好,因为 S3 存储桶有响应,而且我已经在博客上启动并运行 OmniAuth。

这是在 chrome 控制台上显示的图像错误:

我真的需要帮助来建立和运行这个博客。感谢您的时间。


Shrine 默认生成过期的 S3 URL,因此生成的 URL 可能会以某种方式被缓存,一旦 URL 过期,图像就会变得不可用。

作为解决方法,您可以公开 S3 上传并生成公共 URL。您可以通过告诉 S3 存储将上传公开(请注意,这只会影响新上传,现有上传将保持私有,因此您必须以其他方式公开它们)并默认生成公共 URL 来做到这一点,通过更新初始化程序:

# ...

require "shrine/storage/s3"

Shrine.storages = {
  cache: Shrine::Storage::S3.new(prefix: "cache", upload_options: { acl: "public-read" }, **s3_options),
  store: Shrine::Storage::S3.new(prefix: "store", upload_options: { acl: "public-read" }, **s3_options)
}

# ...

Shrine.plugin :default_url_options, cache: { public: true }, store: { public: true }

# ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Heroku、Shrine 和 Amazon S3:博客文章图像在一段时间后消失 的相关文章

随机推荐

  • 如何找到带有标题信息的 ELF 文件/图像的大小?

    我需要找到精灵图像的大小进行一些计算 我尝试过在 Linux 上使用 readelf 实用程序 它提供了有关标题和部分的信息 我需要知道精灵的确切文件大小 总体而言 如何从标题信息中找到 ELF 的大小 或者是否有其他方法可以在不读取完整图
  • Java with ajax - ERR_EMPTY_RESPONSE - 服务器处理请求时 Ajax 响应抛出错误

    我在浏览器控制台中收到以下错误 无法加载资源 net ERR EMPTY RESPONSE 我的 ajax 调用适用于所有按钮点击 但是这个error仅用于一个按钮 可以说testExt按钮 单击这些按钮时 后台脚本将运行并执行一些测试 唯
  • 在 PHP 中将实例方法作为参数传递

    我想创建一个监听器类 class Listener var listeners array public function add callable function this gt listeners function public fu
  • Android应用程序中限时启用按钮

    这是一个示例 我希望能够在用户操作后在有限的时间内 假设 30 分钟 启用我的应用程序中的按钮 30 分钟后 此按钮将再次禁用 在 Android 中实现这一目标的最佳方法是什么 因为用户可能会重新启动设备或关闭应用程序 所以我不能简单地使
  • 如何使 LibGDX 桌面默认全屏显示

    我想知道如何使我的桌面应用程序在启动时全屏显示 我是 LibGDX 的新手 非常感谢任何帮助 谢谢 只需定义fullscreen你的领域LwjglApplicationConfiguration LwjglApplicationConfig
  • 使用 @require_POST 时如何在 Django 中显示 HTTP 状态 405(不允许的方法)的自定义错误页面

    我的问题很简单 当使用 Django 时 如何显示 HTTP 状态 405 方法不允许 的自定义错误页面 require POST装饰师 我正在使用django views decorators http require POST装饰器 当
  • 将 GregorianCalendar 与 SimpleDateFormat 结合使用

    因此 我一直在绞尽脑汁地思考这个 应该是 简单的练习 以使程序将日期字符串转换为GregorianCalendar对象 格式化它 完成后再次以字符串形式返回 这是程序的最后一点 它从文件中获取大量文本 将其分解为单独的记录 然后将记录分解为
  • 如何检查 ArrayList 是否包含另一个 ArrayList 的任何元素? [复制]

    这个问题在这里已经有答案了 有没有办法确定 ArrayList 是否包含不同 ArrayList 的任何元素 像这样 list1 contains any element of list2 正在循环遍历所有元素list2并一一检查元素是唯一
  • 两人网格穿越游戏

    Given a M N两名玩家的网格和位置p1 and p2在网格上 有 n 个球放置在网格上的不同位置 设这些球的位置为B 1 B 2 B 3 B n 我们需要计算曼哈顿最短距离需要挑选所有的球 应按升序挑选球 即如果B i 之前被挑选过
  • 如何以编程方式授予用户权限?

    我知道我可以授予权限 host 4502 useradmin 当我双击用户登录并转到Permissions tab 我想在部署内容包时授予权限 是否可以 当您向用户授予特定节点 路径的权限时 它基本上将权限存储在rep policy节点下面
  • 检查Python中的字符串是否只包含字母

    我有这种形式的字符串 字符串空间 字符串空间 字符串 test test test1 test2 test test1 我想要的是所有三个字符串都只有字母 如果没有则返回 false 我尝试了 isalpha 但没有给出正确的结果 哎呀 这
  • 如何增加sqlplus列输出长度?

    我有一些查询要从架构中找出某些对象的 ddl 我得到的结果列在查询中间被截断 如何增加列的宽度 我尝试过 SET SERVEROUTPUT ON SIZE 1000000 SET LINESIZE 50000 set pagesize 50
  • Google Play 商店:如何上传更多 APK 以支持不同的 CPU 架构

    我希望每个 APK 支持不同的 CPU 架构 例如 ARM x86 和 MIPS 如何上传更多APK 我已经切换到高级模式 但是将新 APK 上传到 Alpha按钮取代了以前的APK 附件是我的控制台在 APK 部分的外观 将感谢您的帮助
  • ts-node 找不到我的类型定义文件

    当我跑步时ts node node modules jasmine bin jasmine我收到这些错误 tsc globals ts 7 12 error TS2304 Cannot find name SugarcubeState 7
  • 单精度浮点无法表示的最小整数

    所以我知道单精度浮点不能表示的最小正整数是2 23 1 1 16 777 217 我们如何知道我们使用 2 23 1 1 我知道有一个隐含的 1 而 23 是尾数中表示的位数 但为什么会这样呢 我们怎么知道我们使用 2 23 1 1 IEE
  • 在运行时更改类属性中的值

    如果我有一堂这样的课 Attr Blah Data Blah public class Test SuperClass 有没有办法可以在运行时更改类实例的属性值 例如在伪代码中 SuperClass test new Test test A
  • 在不同数据库模式之间同步数据的最佳技术?

    我有一个现有的 SQL Server 2005 数据库 用于运行我们的会计 库存应用程序 我们正在考虑使用一个新的在线订购框架 它有自己的数据库 如果我们使用这个新框架 我们将需要几乎实时地将在线订购数据 库存 价格 订单 客户 传输到我们
  • 如何显示多个本地通知?

    我有一个消息应用程序 我正在使用VoIP notifications向用户发送确认 我每次都会发出本地通知PushKit delegate叫做 当前的情况是先前的通知被删除并被新的通知取代 有没有办法管理本地通知 以便用户可以在其设备中看到
  • 我可以使变量暂时不稳定吗?

    In PSoC http www cypress com psoc4 source CY ENG HEADER 可以在内存空间中声明变量 由于闪存读取速度比 RAM 读取速度慢 因此程序将受益于编译器优化 允许将值存储在寄存器中或以其他方式
  • Heroku、Shrine 和 Amazon S3:博客文章图像在一段时间后消失

    我有一个使用 Rails 5 1 开发的博客页面 一切工作正常 除了在我在制作中创建帖子并附加图像后 图像在一段时间 例如 30 分钟 后停止显示 我在互联网上寻找解决方案并看到this https shrinerb com rdoc cl