mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
added a rake task to clean orphan uploaded files
This commit is contained in:
@@ -15,4 +15,9 @@ module LocalStore
|
||||
return Discourse::base_uri + "#{url_root}/#{clean_name}"
|
||||
end
|
||||
|
||||
def self.remove_file(url)
|
||||
File.delete("#{Rails.root}/public#{url}")
|
||||
rescue Errno::ENOENT
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
48
lib/s3.rb
48
lib/s3.rb
@@ -1,22 +1,44 @@
|
||||
module S3
|
||||
|
||||
def self.store_file(file, sha1, image_info, upload_id)
|
||||
raise Discourse::SiteSettingMissing.new("s3_upload_bucket") if SiteSetting.s3_upload_bucket.blank?
|
||||
raise Discourse::SiteSettingMissing.new("s3_access_key_id") if SiteSetting.s3_access_key_id.blank?
|
||||
raise Discourse::SiteSettingMissing.new("s3_secret_access_key") if SiteSetting.s3_secret_access_key.blank?
|
||||
S3.check_missing_site_settings
|
||||
|
||||
@fog_loaded = require 'fog' unless @fog_loaded
|
||||
directory = S3.get_or_create_directory(SiteSetting.s3_upload_bucket)
|
||||
|
||||
remote_filename = "#{upload_id}#{sha1}.#{image_info.type}"
|
||||
|
||||
options = S3.generate_options
|
||||
directory = S3.get_or_create_directory(SiteSetting.s3_upload_bucket, options)
|
||||
# if this fails, it will throw an exception
|
||||
file = S3.upload(file, remote_filename, directory)
|
||||
|
||||
return "//#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/#{remote_filename}"
|
||||
end
|
||||
|
||||
def self.remove_file(url)
|
||||
S3.check_missing_site_settings
|
||||
|
||||
directory = S3.get_or_create_directory(SiteSetting.s3_upload_bucket)
|
||||
|
||||
file = S3.destroy(url, directory)
|
||||
end
|
||||
|
||||
def self.check_missing_site_settings
|
||||
raise Discourse::SiteSettingMissing.new("s3_upload_bucket") if SiteSetting.s3_upload_bucket.blank?
|
||||
raise Discourse::SiteSettingMissing.new("s3_access_key_id") if SiteSetting.s3_access_key_id.blank?
|
||||
raise Discourse::SiteSettingMissing.new("s3_secret_access_key") if SiteSetting.s3_secret_access_key.blank?
|
||||
end
|
||||
|
||||
def self.get_or_create_directory(name)
|
||||
@fog_loaded = require 'fog' unless @fog_loaded
|
||||
|
||||
options = S3.generate_options
|
||||
|
||||
fog = Fog::Storage.new(options)
|
||||
|
||||
directory = fog.directories.get(name)
|
||||
directory = fog.directories.create(key: name) unless directory
|
||||
|
||||
directory
|
||||
end
|
||||
|
||||
def self.generate_options
|
||||
options = {
|
||||
provider: 'AWS',
|
||||
@@ -28,14 +50,6 @@ module S3
|
||||
options
|
||||
end
|
||||
|
||||
def self.get_or_create_directory(name, options)
|
||||
fog = Fog::Storage.new(options)
|
||||
directory = fog.directories.get(name)
|
||||
directory = fog.directories.create(key: name) unless directory
|
||||
|
||||
directory
|
||||
end
|
||||
|
||||
def self.upload(file, name, directory)
|
||||
directory.files.create(
|
||||
key: name,
|
||||
@@ -45,4 +59,8 @@ module S3
|
||||
)
|
||||
end
|
||||
|
||||
def self.destroy(name, directory)
|
||||
directory.files.destroy(key: name)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -30,3 +30,22 @@ task "images:reindex" => :environment do
|
||||
end
|
||||
puts "\ndone."
|
||||
end
|
||||
|
||||
desc "clean orphan uploaded files"
|
||||
task "images:clean_orphans" => :environment do
|
||||
RailsMultisite::ConnectionManagement.each_connection do |db|
|
||||
puts "Cleaning up #{db}"
|
||||
# ligthweight safety net to prevent users from wiping all their uploads out
|
||||
if PostUpload.count == 0 && Upload.count > 0
|
||||
puts "The reverse index is empty. Make sure you run the `images:reindex` task"
|
||||
next
|
||||
end
|
||||
Upload.joins("LEFT OUTER JOIN post_uploads ON uploads.id = post_uploads.upload_id")
|
||||
.where("post_uploads.upload_id IS NULL")
|
||||
.find_each do |u|
|
||||
u.delete
|
||||
putc "."
|
||||
end
|
||||
end
|
||||
puts "\ndone."
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user