Ich arbeite mit einer gehosteten Website, auf der einige Bilder fehlen.
Eines der fehlenden Bilder, das aus einer früheren Überarbeitung eines Beitrags stammt, verweist auf https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png
Es scheint, dass das Bild in S3 vorhanden ist, aber nicht in der Uploads-Tabelle. Zuvor konnte ich Bilder in einem neuen Beitrag erneut hinzufügen, um einen neuen Upload-Datensatz zu erstellen, der alle Beiträge korrigiert, die dieses Bild verwenden, wenn sie neu gebacken werden.
Ich habe zuerst versucht, die URL einzufügen, in der Hoffnung, dass Discourse das Bild herunterlädt und einen Upload-Datensatz erstellt, aber das hat nicht funktioniert. Dann habe ich es über den Browser hochgeladen, aber das neue Bild ist anders und erhält diese URL: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/d/d59e3eccc6d9d038b6fae8910e787e851c8714de.png (es besteht die Möglichkeit, dass ich vertauscht habe, welches Bild welches war).
Außerdem stellt sich die Frage, wie die Datensätze überhaupt aus der Uploads-Tabelle fehlen. Ich arbeite mit einer anderen, früher gehosteten Website, auf der ebenfalls eine Reihe von Bildern aus der Uploads-Tabelle fehlen. Dies könnte ein zweites Thema verdienen, aber es könnte damit zusammenhängen. Bei vielen dieser Bilder konnte ich sie in S3 finden, herunterladen und einen neuen Upload-Datensatz wie folgt erstellen:
sha1= Upload.sha1_from_short_url(short_url)
extension = short_url.split(".").last
upload = Upload.find_by(sha1: sha1)
prefix = "url for the s3 bucket"
if !upload
# try to find it in 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
# make upload for file
...
Diese Methode scheint etwa 25% der betroffenen Beiträge auf der anderen Website zu beheben.