ActiveStorage::IntegrityError 何时引发?
Posted
技术标签:
【中文标题】ActiveStorage::IntegrityError 何时引发?【英文标题】:When is ActiveStorage::IntegrityError raised? 【发布时间】:2019-02-19 11:52:46 【问题描述】:我的应用程序(本地)在尝试附加文件时会引发 ActiveStorage::IntegrityError
错误。我怎样才能摆脱这个错误?
我只有一个has_one_attached
,但我不知道这个错误是怎么造成的。
# model
has_one_attached :it_file
Tempfile.open do |temp_file|
# ...
it_file.attach(io: temp_file, filename: 'filename.csv', content_type: 'text/csv')
end
# storage.yml
local:
service: Disk
root: <%= Rails.root.join("storage") %>
编辑:它可能与删除 storage/
目录有关(它发生在我删除它之后)或者它可能是因为它发生在工作中(完整错误是 Error performing ActivityJob (Job ID: .. ) from Async( .. ) in .. ms: ActiveStorage::IntegrityError (ActiveStorage::IntegrityError)
这不会将文件添加到storage/
文件夹,但是当我尝试附加它们时它会在其下生成文件夹。
【问题讨论】:
它是Tempfile
。当我在那里尝试temp_file.rewind
时,没有更多错误。
我的同事在他的 Docker 环境中遇到了同样的问题。所有其他同事都没有这个问题。 ActiveStorage::IntegrityError 在恢复文件损坏时引发(校验和与恢复的文件不匹配)......我仍在我的环境中调试这个为什么会发生这种情况,只是在这里发布一些注释;)
@equivalent8 关于为什么会发生这种情况的更多想法。我已经为此工作了一段时间。我的问题似乎也与 Docker 有关。
@equivalent8 你解决过这个问题吗?我在 docker 环境中遇到了完全相同的问题,而且我是唯一一个得到它的人。
【参考方案1】:
很奇怪。更新到 rails 6.0 后,我必须重新计算一些校验和。是的,我使用了 dokku,docker。更新前还好。
# Disk service is in use for ActiveStorage
class ProjectImage < ApplicationRecord
has_one_attached :attachment
end
# update all checksums
ProjectImage.all.each do |image|
blob = image.attachment.blob
blob.update_column(:checksum, Digest::MD5.base64digest(File.read(blob.service.path_for(blob.key))))
end;
【讨论】:
【参考方案2】:正如 cmets 中所述,发生这种情况的一个原因是文件对象位于文件末尾,这就是本例中的问题。可以在此处使用temp_file.rewind
进行修复。
【讨论】:
是的,我也是。这同样适用于普通的 File 实例。以上是关于ActiveStorage::IntegrityError 何时引发?的主要内容,如果未能解决你的问题,请参考以下文章