【问题标题】:When is ActiveStorage::IntegrityError raised?ActiveStorage::IntegrityError 何时引发?
【发布时间】: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 环境中遇到了完全相同的问题,而且我是唯一一个得到它的人。

标签: rails-activestorage ruby-on-rails-5.2


【解决方案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 实例。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2021-05-02
    • 2021-08-01
    • 2017-06-05
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多