Не удается создать аватары пользователей при переходе на новый сервер, так как расширение «unknown»

РЕДАКТИРОВАНИЕ: Я переоцениваю это как ошибку, чтобы кто-то, кто разбирается в этом лучше меня, мог посмотреть на это.

У множества загруженных файлов расширение было «unknown». Это означает, что невозможно сгенерировать миниатюры. Я думаю, что это произошло при переносе резервной копии на новый сайт, после чего потребовалось повторно сгенерировать миниатюры.

Я считаю, что при попытке сгенерировать миниатюры, если расширение равно «unknown», следует заменить его, например:

 upload.extension = upload.original_filename.split('.').last

Кажется, если бы это было реализовано где-то, я бы не потратил на это 4 часа.

Погодите. Вот в чём проблема. Почему возвращается false, а не расширение из имени файла?

Далее следуют подробные детали.

Я перенёс сайт из /community в community.example.com, сделав резервную копию и восстановив её. Я исправил загрузки с помощью команды:

 RAILS_ENV=production bundle exec script/discourse remap '/community/uploads' '/uploads'

Но аватары всё ещё отображаются как «Серый человек».

Когда я смотрю на user.user_avatar.custom_upload.url и вставляю этот URL в браузер, я получаю нужный аватар. Похоже, мне нужно «пересоздать» пользователей.

Я думал, что, возможно, команда

rake avatars:refresh

или

rake avatars:clean

исправит это, но безрезультатно.

Что я упускаю?

1 лайк

В Sidekiq есть триггер для создания отсутствующих аватаров.

Это займёт некоторое время, но, если я не ошибаюсь, это должно помочь.

2 лайка

Хорошо! Этот вызов User.refresh_avatar, но, к сожалению, код

  user=User.find_by_username('broken_avatar_guy')
  user.refresh_avatar

тоже не решает проблему.

2 лайка

Вот подсказка:

ActionController::RoutingError (Нет маршрута для [GET] "/user_avatar/community.example.com/broken_user")
1 лайк

Выполняется ли обновление при входе пользователя в аккаунт?

Я так не думаю.

user.user_avatar.custom_upload содержит правильный URL, но по адресу https://community.example.com/user_avatar/community.example.com/bad_user/25/321_2.png отсутствует изображение аватара. Мне нужно найти способ пересоздать эти миниатюры аватаров.

В коде я увидел force_avatar_update при входе пользователя.

Это может быть очень полезно, похоже на работу

Что-то явно не так:

user = User.find_by_username('Tuomo')
upload_id = user.user_avatar.custom_upload.id
upload = Upload.find(upload_id)
Discourse.avatar_sizes.each do |size|
  OptimizedImage.create_for(upload, size, size)
end
OptimizedImage.where(upload_id: upload_id)

И я не получаю оптимизированных изображений.

broken_uploads = Upload.where(extension: "unknown")
broken_uploads.each do |upload|
  upload.extension = upload.original_filename.split('.').last
  upload.save
end

исправляет это.

Затем мне нужно просто сгенерировать новые миниатюры, вот так:

has_upload = UserAvatar.where("custom_upload_id > 0")

has_upload.each do |user_avatar|
  Jobs.enqueue(:create_avatar_thumbnails, {upload_id: user_avatar.custom_upload_id})
end
2 лайка

Думаю, это настоящая ошибка, и Джефф поставил лайк, но она не привлекла большего внимания.

Я сошел с ума или что-то здесь сломано?

2 лайка

Я перенёс сайт из /community на community.example.com, сделав резервную копию и восстановив её.

Думаю, мы просто не сталкивались с этим при наших восстановлениях, потому что то, на что вы жалуетесь здесь, — это артефакты восстановления, верно? Возможно, это специфично для этой конкретной резервной копии и восстановления?

1 лайк