أنا أعمل مع موقع مستضاف يفتقد بعض الصور.
إحدى الصور المفقودة، المأخوذة من مراجعة سابقة لمنشور، تشير إلى https://aws1.discourse-cdn.com/business7/uploads/harness/original/2X/1/16d12d54b3b4ae7aabc8a93417570bce0984e3c9.png
يبدو أن الصورة موجودة في S3 ولكن ليس في جدول Uploads. قبل ذلك، تمكنت من إعادة إضافة الصور في منشور جديد لإنشاء سجل تحميل جديد، مما أدى إلى إصلاح جميع المنشورات التي تستخدم هذه الصورة عند إعادة خبزها.
حاولت أولاً لصق الرابط على أمل أن يقوم Discourse بتنزيل الصورة وإنشاء سجل تحميل، لكنه لم يفعل، لذا قمت بتحميلها عبر المتصفح، لكن الصورة الجديدة مختلفة وتحصل على هذا الرابط: 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٪ من المنشورات المتأثرة على الموقع الآخر.