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 何时引发?的主要内容,如果未能解决你的问题,请参考以下文章