В Rails 5.2.1 у меня есть ActiveStorage (5.2.1), настроенный для службы Disk
.
У меня есть модель Pic:
class Pic < ApplicationRecord
has_one_attached :image
end
Могу прикрепить изображения:
imgpath = "/tmp/images/..."
Pic.first.image.attach(io: File.open(imgpath), filename: imgpath)
Я хотел сделать это в чем-то вроде задачи Rake (но результат будет таким же, если сделать это из консоли Rails) для пакетной загрузки изображений, например:
pfs = Dir['testpics/*']
Pic.all.each { |pic|
pf = pfs.shift
pic.image.attach(io: File.open(pf), filename: pf)
}
Это работает без ошибок. Однако, как ни странно (по крайней мере для меня), некоторые изображения не имеют впоследствии соответствующего большого двоичного объекта, и запросы завершаются с ошибкой 500 Internal Server Error: Errno::ENOENT (No such file or directory @ rb_sysopen
.
Проверка pic.image.attached?
возвращает истину. Однако pic.image.download
выдает исключение.
Еще более странно то, что вызов pic.image.download
сразу после его прикрепления работает. 2 секунды спустя это не так.
Единственный способ узнать, правильно ли загружено изображение, - это подождать ~ 2 секунды после его прикрепления и затем попытаться загрузить. Если я продолжу повторять попытки прикрепления после ожидания 2 секунд и проверки, все ли в порядке, все изображения будут в порядке. Но очевидно, что это неправильно. :) Простое ожидание между вызовами присоединения не помогает, я должен проверять после ожидания, затем повторно подключаться, а затем проверять снова, пока все не будет в порядке - иногда нормально с первой попытки, иногда 10-й, но в конечном итоге преуспеет.
Это все на моем локальном диске, а не, например, временное хранилище в Heroku. Также я запускаю его на Ubuntu 18.04 (Bionic), но ничего не установлено, что должно удалять капли (т.е. без антивируса и т.п.). Я действительно думаю, что проблема внутренняя в ActiveStorage, или, может быть, в том, как я ее использую.
В чем дело? Куда деваются капли через несколько секунд, когда они уже были успешно загружены?
С сервисом S3 все нормально, блобы не пропадают.