Avatars manquants après importation

J’ai une importation vBulletin pour un client hébergé. Les avatars ont disparu et sont maintenant affichés sous la forme d’une silhouette générique vide comme cela.

Je suis presque certain qu’ils étaient présents à un moment donné. Les URL semblent indiquer qu’elles devraient contenir quelque chose. Y a-t-il un moyen de les retrouver ?

Maybe related to that?

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

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.

J’ai effectué une restauration de la base de données à partir d’une sauvegarde (il y avait des migrations de base de données issues d’une ancienne version et le fichier backup.sql.gz ne contenait que le SQL, pas les fichiers uploadés).

Malheureusement, les avatars ne s’affichent pas sur le site (seul le placeholder par défaut apparaît).

Ils semblent être correctement enregistrés dans la base de données, l’URL est correcte et le fichier PNG existe :

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>

Pourriez-vous me conseiller sur les prochaines étapes à essayer ? Merci d’avance !

Mise à jour :

Certains avatars ont été régénérés en arrière-plan… Puis-je accélérer le processus ? Ou le lancer manuellement ?

D’après mes observations, cette partie pourrait-elle être un signe du problème ?

extension: "unknown",

Il semble que ceux qui ont été régénérés aient maintenant ce champ rempli :

extension: "JPG",

D’une manière ou d’une autre, après une restauration de sauvegarde et une migration de Discourse de la version 1.6 vers la 2.5, ma base de données ne contenait plus les valeurs de largeur, de hauteur et d’extension pour la table Upload (les pointeurs de fichiers étaient corrects et les fichiers étaient bien en place).

J’ai fini par créer un script qui parcourt tous les avatars personnalisés téléchargés, corrige l’extension et les dimensions, puis régénère toutes les images optimisées avec des vignettes de version 2, qui me manquaient.

Pour ceux que cela intéresse, le voici :

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 "\nAucune upload trouvée pour cet avatar utilisateur"
    next
  end
  
  # Corriger "unknown"
  if upload.extension === 'unknown'
    upload.extension = nil 
    upload.save!
    puts "\rupload_id #{upload.id} extension unknown -> nil"
  end

  if upload.extension.nil?
    puts "\rupload_id #{upload.id} correction de l'extension"

    upload.fix_image_extension

    if upload.height == 0 || upload.width == 0
      puts "\rupload_id #{upload.id} correction des dimensions"
      upload.fix_dimensions!
    end

    # Vérifier la version optimisée
    correct_optimized = OptimizedImage.where(upload_id: upload_id)
      .where(version: 2)

    if correct_optimized.count < 1
      puts "\rupload_id #{upload.id} n'a pas de vignettes de version 2"

      # Supprimer les versions optimisées anciennes
      puts "\rupload_id #{upload.id} suppression des avatars"
      optimized = OptimizedImage.where(upload_id: upload_id)

      if optimized
        optimized.destroy_all
      end

      # Générer les versions optimisées
      puts "\rupload_id #{upload.id} création des avatars"
      Discourse.avatar_sizes.each {|size| OptimizedImage.create_for(upload, size, size, allow_animation: SiteSetting.allow_animated_avatars)}

      generated_count += 1

      puts "\r#{generated_count} avatars générés au total"

    end
  end

end