Aber ich kann keine Dateien auflisten, da sie sich in Ihrem Bucket befinden und ich ziemlich sicher bin, dass ich Anmeldeinformationen für eine Liste benötige.
rake uploads:fix_missing_s3 scheint (die meisten?) Dinge auf das lokale Dateisystem gezogen zu haben (Uploads sind für diese Website noch nicht auf S3).
Also habe ich Folgendes getan, um die Uploads zu reparieren:
def fix_bad_uploads(bad_uploads)
fixed = 0
retrieved = 0
missing = 0
bad_bucket="//discourse-cloud-file-uploads.s3.dualstack.us-west-2.amazonaws.com/business6/uploads/forumosa"
bad_uploads.each do |upload|
url = URI.parse("https:"+upload.url)
upload.url=upload.url.gsub(bad_bucket,"/uploads/default")
if File.exists?("/shared/#{upload.url}")
fixed += 1
print "1"
upload.save
# posts = Post.where("raw like '%#{upload.short_url}%'")
# posts.each do |post|
# post.rebake!
# print "."
# end
else
begin
# retrieve missing
filename = "/shared#{upload.url}"
dirname = File.dirname(filename)
unless File.directory?(dirname)
FileUtils.mkdir_p(dirname)
end
file = File.new(filename, "w")
Net::HTTP.start(url.host) do |http|
resp = http.get(url.path)
open(file, "wb") do |file|
file.write(resp.body)
end
end
file.close
print "+"
upload.save if File.exists?(filename)
rescue => e
puts "bad: #{e}"
missing += 0
sleep 1
print "0"
end
end
end
end
Dies hat die meisten behoben. Aber es scheint einige Beiträge zu geben, die einen uploads://-Eintrag haben, für den es keinen Upload in der Datenbank gibt. Das erneute Backen dieser führt zu einem transparent.png.
Dann habe ich versucht, so etwas zu tun:
def get_missing_short_url(short_url)
prefix = "https://discourse-cloud-file-uploads.s3.dualstack.us-west-2.amazonaws.com/business6/uploads/forumosa/original/3X"
remove_url = "https://discourse-cloud-file-uploads.s3.dualstack.us-west-2.amazonaws.com/business6/uploads/forumosa/"
sha1= Upload.sha1_from_short_url(short_url)
extension = short_url.split(".").last
upload = Upload.find_by(sha1: sha1)
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}"
sleep 1
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
File.open(filename, "r") do |file|
upload = UploadCreator.new(
file,
File.basename(file),
).create_for(Discourse.system_user.id)
end
if upload.persisted?
puts "We did it! #{upload.id}"
else
puts "darn. #{upload.errors.full_messages}"
sleep 5
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
end
upload
end
Das funktioniert größtenteils, aber in meinen Tests gelingt es mir manchmal nicht, die richtige S3-URL aus dem SHA abzuleiten, den ich aus der Kurz-URL ableite. Ich bin mir nicht sicher, wie ich das beheben soll.
Außerdem hat einer von ihnen irgendwie einen sha bekommen, der sich von dem im Dateinamen des S3-Pfads unterschied.
Mein aktueller Gedanke ist, zunächst alle cooked durchzugehen und alle https://discourse-cloud-file-uploads-URLs zu extrahieren und dann die Upload-Datensätze, die sich darauf beziehen, zu aktualisieren und die fehlenden zu erstellen.
Fehlt mir etwas Offensichtliches?