提问人:Jason Burgett 提问时间:11/9/2023 最后编辑:Jason Burgett 更新时间:11/9/2023 访问量:50
Ruby on Rails 6.0 升级后缩略图损坏
Thumbnail images broken after Ruby on Rails 6.0 upgrade
问:
将基于 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 %>
这导致了一些奇怪的行为。一些缩略图会生成良好的信息,而另一些缩略图将显示为损坏的引用,如下所示:
当这种情况发生时,以下是日志中的最后几行相关行:
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 -qualiy
storage
我不太担心修复已经损坏的缩略图,而是为新创建的票证找出修复方法。任何见解都是值得赞赏的,我现在被难住了。
答:
听起来像是 Active Storage 的校验和验证过程存在问题。这期望文件内容与其记录的校验和匹配。如果直接在目录中修改图像,则可能会导致不匹配。storage
要解决此问题,一种选择是禁用对变体的完整性检查。这应该可以防止在校验和由于外部修改而不匹配时引发错误。
# config/application.rb
Rails.application.config.active_storage.track_variants = false
或者,考虑使用 Active Storage 的变体方法动态调整图像大小,从而保持原始文件的完整性。
image.variant(resize_to_limit: [150, 150]).processed
对于现有的损坏缩略图,您可以参考此答案来重新计算校验和。
评论
image.variant(resize_to_limit: [150, 150]).processed
Rails.application.config.active_storage.track_variants = false
评论