Вы можете выполнить задачу rake, которая перебирает ваши вложения и отправляет каждое из них на S3. Я использовал это некоторое время назад с attachment_fu - не будет слишком отличаться. Это использует драгоценный камень aws-s3.
В основном этот процесс:
1. Выберите файлы из базы данных, которые необходимо переместить
2. подтолкнуть их к S3
3. Обновите базу данных, чтобы отразить, что файл больше не хранится локально (таким образом, вы можете делать это в пакетном режиме и вам не нужно беспокоиться о том, чтобы дважды нажать один и тот же файл).
@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