ruby-on-rails 缩略图在Ruby on Rails 6.0升级后损坏

0g0grzrc  于 6个月前  发布在  Ruby
关注(0)|答案(1)|浏览(79)

在将基于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'


奇怪的是,使用我上面构建的链接点击源文件总是可以正常工作,即使点击破碎的缩略图也可以打开原始文件。还有一个变量在起作用,这个网站每天都会上传相当多的图片,所以我运行了一个脚本来对所有图像进行降采样(使用mogrify -qualiy)在storage目录中,这些文件是在过去48小时内创建的,目的是为了保存磁盘空间。使用文件大小和5.2不是。
我不太担心修复已经损坏的缩略图,而是为新创建的票证找到修复方法。任何见解都值得赞赏,我现在被难住了。

deikduxw

deikduxw1#

听起来像是Active Storage的校验和验证过程中出现的问题。这要求文件内容与其记录的校验和匹配。如果您直接在storage目录中修改图像,则可能会导致不匹配。
要解决这个问题,一个选择是禁用对变体的完整性检查。这应该可以防止由于外部修改而导致校验和不匹配时引发错误。

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

字符串
或者,可以考虑使用Active Storage's variant method动态调整图像大小,这样可以保持原始文件的完整性。

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


对于现有的断开缩略图,您可以引用this answer来重新计算校验和。

相关问题