Vous pouvez travailler une tâche de rake qui répète sur vos pièces jointes et pousse chacune à S3. Je l'ai utilisé un moment avec attachment_fu - ne serait pas trop différent. Cela utilise la gemme aws-s3.
Fondamentalement, le processus est le suivant: 1. Sélectionnez les fichiers de la base de données qui doivent être déplacés 2. Poussez-les à S3 3. Base de données de mise à jour pour refléter le fait que le fichier n'est stocké plus localement (cette façon, vous pouvez faire les par lots et ne pas avoir à se soucier de pousser deux fois le même fichier).
@attachments = Attachment.stored_locally
@attachments.each do |attachment|
base_path = RAILS_ROOT + '/public/assets/'
attachment_folder = ((attachment.respond_to?(:parent_id) && attachment.parent_id) || attachment.id).to_s
full_filename = File.join(base_path, ("%08d" % attachment_folder).scan(/..../), attachment.filename)
require 'aws/s3'
AWS::S3::Base.establish_connection!(
:access_key_id => S3_CONFIG[:access_key_id],
:secret_access_key => S3_CONFIG[:secret_access_key]
)
AWS::S3::S3Object.store(
'assets/' + attachment_folder + '/' + attachment.filename,
File.open(full_filename),
S3_CONFIG[:bucket_name],
:content_type => attachment.content_type,
:access => :private
)
if AWS::S3::Service.response.success?
# Update the database
attachment.update_attribute(:stored_on_s3, true)
# Remove the file on the local filesystem
FileUtils.rm full_filename
# Remove directory also if it is now empty
Dir.rmdir(File.dirname(full_filename)) if (Dir.entries(File.dirname(full_filename))-['.','..']).empty?
else
puts "There was a problem uploading " + full_filename
end
end