Using ruby to upload multiple files to Amazon S3
#!/usr/bin/env ruby #file : rubys3file2upload.rb require 'rubygems' require 'aws/s3' require 'rexml/document' include REXML class S3FileUpload def initialize(xml_accounts_file, xml_upload_file) initialize_account(xml_accounts_file) main(xml_upload_file) end def initialize_account(accounts_file) file = File.new(accounts_file) doc = Document.new(file) account = doc.root.elements['records/access'] h = Hash.new h[:access_key_id] = account.elements['key_id'].text.to_s h[:secret_access_key] = account.elements['secret'].text.to_s AWS::S3::Base.establish_connection!(h) end def main(xml_upload_file) file = File.new(xml_upload_file) doc = Document.new(file) puts doc doc.root.elements.each('records/file') do |f| local_file = f.elements['local'].text.to_s bucket = f.elements['bucket'].text.to_s mime_type = f.elements['mime_type'].text.to_s upload(local_file, mime_type, bucket) end end def upload(local_file, mime_type, bucket) base_name = File.basename(local_file) puts "Uploading #{local_file} as '#{base_name}' to '#{bucket}'" AWS::S3::S3Object.store( base_name, File.open(local_file), bucket, :content_type => mime_type, :access => :public_read ) puts "Uploaded!" end end if __FILE__ == $0 s3fu = S3FileUpload.new('s3accounts.xml', 's3files2upload.xml') end
file: s3accounts.xml
<s3accounts> <summary/> <records> <access id="100"><name>REPLACE_ME</name><key_id>REPLACE_ME</key_id><secret>REPLACE_ME</secret></access> </records> </s3accounts>
file: s3files2upload.xml
<s3files2upload> <summary/> <records> <file> <local>autocomplete.html</local> <bucket>t2000</bucket> <mime_type>text/html</mime_type> </file> <file> <local>autocomplete2.html</local> <bucket>t2000</bucket> <mime_type>text/html</mime_type> </file> <file> <local>autocomplete3.html</local> <bucket>t2000</bucket> <mime_type>text/html</mime_type> </file> </records> </s3files2upload>
Note: The file given the correct permission could be read from http://t2000.s3.amazonaws.com/autocomplete.html
Reference: http://amazon.rubyforge.org/