Estoy trabajando con un sitio alojado al que le faltan algunas imágenes.
Una de las imágenes que faltan, tomada de una revisión anterior de una publicación, apunta a https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png
Parece que la imagen está en S3 pero no en la tabla Uploads. Antes, podía volver a añadir imágenes en una nueva publicación para que se creara un nuevo registro de carga, lo que solucionaba todas las publicaciones que utilizaban esa imagen cuando se volvían a hornear.
Primero intenté pegar la URL esperando que Discourse descargara la imagen y creara un registro de carga, pero no lo hizo, así que la subí a través del navegador, pero la nueva imagen es diferente y obtiene esta URL: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/d/d59e3eccc6d9d038b6fae8910e787e851c8714de.png (existe la posibilidad de que haya invertido cuál imagen era cuál).
También está la cuestión de cómo desaparecieron los registros de la tabla Uploads en primer lugar. Estoy trabajando con otro sitio anteriormente alojado, al que también le faltan un montón de imágenes en la tabla Uploads. Esto podría merecer un segundo tema, pero podría estar relacionado. Para un montón de esas imágenes, pude encontrarlas en S3, descargarlas y crear un nuevo registro de Upload como este:
sha1= Upload.sha1_from_short_url(short_url)
extension = short_url.split(".").last
upload = Upload.find_by(sha1: sha1)
prefix = "url del bucket de s3"
if !upload
# intentar encontrarlo en 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
# crear carga para el archivo
...
Parece que este método solucionará aproximadamente el 25% de las publicaciones afectadas en el otro sitio.