インポート後にアバターが表示されない

vBulletin のインポートをホストされている顧客向けに行っています。アバターが消失し、現在は これ のような一般的な空白の人型のアイコンとして表示されています。

以前は表示されていたと確信しています。URL を見ると、何かが含まれているはずです。それらを見つける方法はありませんか?

Maybe related to that?

「いいね!」 1

Do you have a backup where you can check the URL?
Are they in the tombstone?

「いいね!」 1

I did a fresh import and all of the avatars are missing. Sidekiq still has 13M things to process, but I don’t see how that could be the problem. I did another import on another site with what I believe to be the same import script and the avatars are fine there.

pry(main)> User.find_by_username('MysteryManAvatar').uploaded_avatar
=> #<Upload:0x0000558a0d31b478
 id: 97,
 user_id: 114,
 original_filename: "clevername.jpg",
 filesize: 2028,
 width: 90,
 height: 67,
 url: "/uploads/default/original/1X/080817dcf59ddc838054fba9716b62fce9ae3d83.jpg",
 created_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 updated_at: Thu, 19 Apr 2018 23:51:15 UTC +00:00,
 sha1: "080817dcf59ddc838054fba9716b62fce9ae3d83",
 origin: nil,
 retain_hours: nil,
 extension: "jpg">

But that file isn’t in uploads (or tombstone).

I looked at Avatars not showing after import and that didn’t seem to be related.

バックアップからデータベースをリストアしました(古いバージョンからのデータベースマイグレーションがあり、backup.sql.gz にはアップロードファイルではなく SQL のみが含まれていました)。

残念ながら、サイト上でアバターが表示されません(デフォルトのプレースホルダーのみ表示されます)。

データベース内では正しく保存されており、URL も正しく、PNG ファイルも存在しているようです。

root@og-app:/var/www/discourse# rails c
[1] pry(main)> User.find_by_username('Overgrow').uploaded_avatar
=> #<Upload:0x0000565323a78880
 id: 2936,
 user_id: 1,
 original_filename: "avatar.png",
 filesize: 161585,
 width: nil,
 height: nil,
 url:     "/uploads/default/original/2X/f/fbba12aa89b1bc45676efcfa55affd4b7a76edf1.png",
 created_at: Sat, 03 Sep 2016 10:26:23 UTC +00:00,
 updated_at: Sat, 22 Feb 2020 11:57:35 UTC +00:00,
 sha1: "fbbe22aa89b1bc45676efcfa55affd4b7a76edf1",
 origin: nil,
 retain_hours: nil,
 extension: "unknown",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil>

次に何を試すべきかアドバイスいただけますでしょうか?よろしくお願いいたします!

追記:

いくつかのアバターはバックグラウンドで再生成されました…この処理を高速化することはできますか?あるいは手動で実行することは可能でしょうか?

私の観察によると、この部分が問題の原因の兆候ではないでしょうか?

extension: "unknown",

再生成されたアバターでは、このフィールドが次のように埋められているようです:

extension: "JPG",

何らかの理由で、1.6 から 2.5 への Discourse のバックアップ復元とマイグレーション後、Upload テーブルの width、height、extension の値が欠落していました(ファイルポインタは正しく、ファイルも適切な場所にありました)。

結局、カスタムアップロードされたアバターをすべて確認し、拡張子と寸法を修正するとともに、バージョン 2 のサムネイルが欠落していた OptimizedImages をすべて再生成するスクリプトを作成しました。

興味のある方のために、以下にそのスクリプトを示します:

fix-avatars.rb

require File.expand_path("../../config/environment", __FILE__)

generated_count = 0

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

scope.find_each do |ua|

  upload_id = ua.custom_upload_id

  upload = Upload.find_by(id: upload_id)
  
  unless upload
    puts "\nこのユーザーのアバターに対応するアップロードが見つかりません"
    next
  end
  
  # 不明な拡張子を修正
  if upload.extension === 'unknown'
    upload.extension = nil 
    upload.save!
    puts "\rupload_id #{upload.id} 拡張子 unknown -> nil"
  end

  if upload.extension.nil?
    puts "\rupload_id #{upload.id} 拡張子を修正中"

    upload.fix_image_extension

    if upload.height == 0 || upload.width == 0
      puts "\rupload_id #{upload.id} 寸法を修正中"
      upload.fix_dimensions!
    end

    # 最適化バージョンを確認
    correct_optimized = OptimizedImage.where(upload_id: upload_id)
      .where(version: 2)

    if correct_optimized.count < 1
      puts "\rupload_id #{upload.id} にバージョン 2 のサムネイルがありません"

      # 古い最適化画像を削除
      puts "\rupload_id #{upload.id} アバターを削除中"
      optimized = OptimizedImage.where(upload_id: upload_id)

      if optimized
        optimized.destroy_all
      end

      # 最適化画像を生成
      puts "\rupload_id #{upload.id} アバターを生成中"
      Discourse.avatar_sizes.each {|size| OptimizedImage.create_for(upload, size, size, allow_animation: SiteSetting.allow_animated_avatars)}

      generated_count += 1

      puts "\r合計 #{generated_count} 個のアバターを生成しました"

    end
  end

end
「いいね!」 1