Я работаю с размещённым сайтом, на котором отсутствуют некоторые изображения.
Одно из отсутствующих изображений, взятое из предыдущей версии поста, указывает на ссылку: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png
Кажется, что изображение находится в S3, но отсутствует в таблице Uploads. Раньше я мог добавить изображения в новый пост, чтобы создать новую запись об загрузке, что исправляло все посты, использующие это изображение, после их повторной обработки.
Сначала я попробовал вставить URL, надеясь, что Discourse загрузит изображение и создаст запись об загрузке, но этого не произошло. Тогда я загрузил его через браузер, но новое изображение оказалось другим и получило такой URL: https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/d/d59e3eccc6d9d038b6fae8910e787e851c8714de.png (возможно, я перепутал, какое из изображений какое).
Также возникает вопрос, почему записи вообще отсутствуют в таблице Uploads. Я работаю с другим ранее размещённым сайтом, на котором также отсутствует множество записей об изображениях в таблице Uploads. Это, возможно, заслуживает отдельной темы, но может быть связано с текущей проблемой. Для ряда таких изображений я смог найти их в S3, загрузить и создать новую запись об загрузке следующим образом:
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
...
Похоже, что этот метод исправит около 25% затронутых постов на другом сайте.