Ruby on Rails 6.0 升级后缩略图损坏

Thumbnail images broken after Ruby on Rails 6.0 upgrade

提问人:Jason Burgett 提问时间:11/9/2023 最后编辑:Jason Burgett 更新时间:11/9/2023 访问量:50

问:

将基于 Rails 5.2 的票务系统升级到 Rails 6.0 后,我遇到了缩略图正确显示的问题,在取消对文件中以下行的注释后,问题似乎已经开始了:config/initializers/new_framework_defaults_6_0.rb

Rails.application.config.active_storage.queues.analysis = :active_storage_analysis
Rails.application.config.active_storage.queues.purge    = :active_storage_purge
Rails.application.config.active_storage.replace_on_assign_to_many = true

我正在我的 ERB 模板中动态计算变体,并使用以下代码链接到原始文件:

<%= link_to image_tag(image.representation(resize: "x150", auto_orient: true)), image %>

这导致了一些奇怪的行为。一些缩略图会生成良好的信息,而另一些缩略图将显示为损坏的引用,如下所示:

enter image description here

当这种情况发生时,以下是日志中的最后几行相关行:

ActiveStorage::Blob Load (0.5ms)  SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1 LIMIT $2  [["id", {a_unique_id}], ["LIMIT", 1]]
Disk Storage (0.1ms) Checked if file exists at key: variants/{a_unique_id}/{a_unique_id} (no)
Disk Storage (0.6ms) Downloaded file from key: {a_unique_id}
Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.5ms | Allocations: 817)
ActiveStorage::IntegrityError (ActiveStorage::IntegrityError):
activestorage (6.0.6.1) lib/active_storage/downloader.rb:39:in `verify_integrity_of'

奇怪的是,使用我上面构建的链接单击源文件总是有效并且可以很好地打开原始文件,即使单击损坏的缩略图也是如此。还有一个变量在起作用,这个网站每天都有相当多的图像上传,所以我运行了一个脚本来对目录中过去 48 小时内创建的所有图像(使用 )进行下采样,以节省磁盘空间。一种猜测是,Rails 6.0 使用文件大小计算存储在 ActiveStorage Blob 中的校验和,而 5.2 则没有。mogrify -qualiystorage

我不太担心修复已经损坏的缩略图,而是为新创建的票证找出修复方法。任何见解都是值得赞赏的,我现在被难住了。

Ruby-on-Rails Ruby-on-Rails-5

评论


答:

1赞 James Hibbard 11/9/2023 #1

听起来像是 Active Storage 的校验和验证过程存在问题。这期望文件内容与其记录的校验和匹配。如果直接在目录中修改图像,则可能会导致不匹配。storage

要解决此问题,一种选择是禁用对变体的完整性检查。这应该可以防止在校验和由于外部修改而不匹配时引发错误。

# config/application.rb 
Rails.application.config.active_storage.track_variants = false

或者,考虑使用 Active Storage 的变体方法动态调整图像大小,从而保持原始文件的完整性。

image.variant(resize_to_limit: [150, 150]).processed

对于现有的损坏缩略图,您可以参考此答案来重新计算校验和。

评论

0赞 Jason Burgett 11/9/2023
当它正常工作时,track_variants到底会做什么?我有什么理由不想禁用它吗?
0赞 James Hibbard 11/9/2023
启用后,它允许 Rails 跟踪已处理文件的每个变体。从理论上讲,禁用可能会导致从缓存中提供过时的图像或无法提供最优化的版本。有关更多信息,请参阅此处:lilyreile.medium.com/...
0赞 James Hibbard 11/10/2023
@JasonBurgett - 我很好奇。以上方法是否解决了您的问题?
1赞 Jason Burgett 11/11/2023
我还没有机会尝试。我希望在接下来的几天里试一试。当我这样做时,我会确保在这里回复。
1赞 Jason Burgett 11/14/2023
更改视图代码未解决问题。我昨晚推动了更改,但我仍然有大约 5% 的缩略图损坏(甚至在重新处理之前,尽管我开始认为这是一条红鲱鱼)。郑重声明,我还没有改变,我很确定这会起作用,但我希望找到一个更精确的修复方法。image.variant(resize_to_limit: [150, 150]).processedRails.application.config.active_storage.track_variants = false