我正在处理一个缺少一些图片的托管网站。
其中一张丢失的图片,取自帖子的先前修订版,指向 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 中找到它们,下载它们,然后创建一个新的 Upload 记录,如下所示:
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% 的受影响帖子。