Блоб изображения ActiveStorage исчезает - PullRequest
0 голосов
/ 28 октября 2018

В 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 Внутренняя ошибка сервера: 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 все в порядке, капли не исчезают.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Теперь ActiveStorage поддерживает DropboxService.Пожалуйста, следуйте за гемом activestorage-dropbox

ActiveStorage :: Service :: DropboxService

Включает службу Dropbox Storage как службу активного хранения.

gem 'activestorage-dropbox'

Использование

Объявление службы Dropbox в config / storage.yml

dropbox:
  service: Dropbox
  access_token: ""
config.active_storage.service = :dropbox

https://rubygems.org/gems/activestorage-dropbox

0 голосов
/ 08 ноября 2018

Ух ты, я думаю, я понял это.Это не столько проблема ActiveStorage, но я оставлю этот вопрос здесь на случай, если он может быть полезен и для кого-то еще.

Оказывается, проблема, скорее всего, в Dropbox.:)

Что происходит со стратегией Disk, ActiveStorage сохраняет идентификаторы двух символов в каталоге storage/ - аналогично хешу.Они могут (и довольно часто) могут отличаться только в случае, например, есть каталоги zu и Zu.Клиент Dropbox мешает этому, если все это находится в каталоге, который синхронизируется с Dropbox, эти каталоги будут переименованы, например, «Zu» станет «zu (Case Conflict)» (так что синхронизация Dropbox работаетна разных платформах).

Конечно, BLOB-объекты больше не обнаруживаются, и все это происходит асинхронно, клиенту Dropbox требуется некоторое время для переименования материала, поэтому он работает некоторое время сразу после присоединения изображения.

Итак, урок усвоен, ActiveStorage плохо работает с Dropbox.

...