Je travaille avec un site hébergé auquel il manque certaines images.
L’une des images manquantes, tirée d’une ancienne révision d’une publication, pointe vers https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png
Il semble que l’image soit dans S3 mais pas dans la table Uploads. Auparavant, j’ai pu réajouter des images dans une nouvelle publication pour qu’un nouvel enregistrement d’upload soit créé, ce qui corrige toutes les publications utilisant cette image lorsqu’elles sont ré-cuites.
J’ai d’abord essayé de coller l’URL en espérant que Discourse télécharge l’image et crée un enregistrement d’upload, mais cela n’a pas fonctionné. J’ai donc téléversé l’image via le navigateur, mais la nouvelle image est différente et obtient cette URL : https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/d/d59e3eccc6d9d038b6fae8910e787e851c8714de.png (il est possible que j’aie inversé les images).
Il y a aussi la question de savoir comment les enregistrements ont disparu de la table Uploads en premier lieu. Je travaille avec un autre site anciennement hébergé, qui manque également un grand nombre d’images dans la table Uploads. Cela pourrait mériter un autre sujet, mais cela pourrait être lié. Pour un grand nombre de ces images, j’ai pu les trouver dans S3, les télécharger et créer un nouvel enregistrement d’Upload comme ceci :
sha1= Upload.sha1_from_short_url(short_url)
extension = short_url.split(".").last
upload = Upload.find_by(sha1: sha1)
prefix = "url du bucket s3"
if !upload
# essayer de la trouver dans s3
one = sha1[0]
two=sha1[1]
url_link = "#{prefix}/#{one}/#{two}/#{sha1}.#{extension}"
puts "URL: #{url_link}"
url = URI.parse(url_link)
full_filename = url_link.gsub(remove_url,"/shared/uploads/default/")
filename = "/tmp/#{File.basename(url_link.gsub(remove_url,"/shared/uploads/default/"))}"
dirname = File.dirname(filename)
unless File.directory?(dirname)
FileUtils.mkdir_p(dirname)
end
File.open(filename, "w") do |file|
Net::HTTP.start(url.host) do |http|
resp = http.get(url.path)
open(file, "wb") do |file|
file.write(resp.body)
end
end
end
# créer l'upload pour le fichier
...
Il semble que cette méthode corrigera environ 25 % des publications affectées sur l’autre site.