We use S3 for a lot of our projects using the aws-s3 gem. One thing that has continually plagued me is copying objects from one bucket to another. Having rewritten this snippet of code twice already, I am placing it here for future reference. Enjoy.

 1class S3Object
 2  def self.copy_across_buckets(src_bucket, src_key, dest_bucket, dest_key, options = {})
 3    original = open(url_for(src_key, src_bucket))
 4    default_options = {:content_type => original.content_type}
 5    store(dest_key, original, dest_bucket, default_options.merge(options))
 6    acl(dest_key, dest_bucket, acl(src_key, src_bucket))
 7  end
 8
 9  def copy_to_bucket(dest_bucket, dest_key = nil, options = {})
10    self.class.copy_across_buckets(bucket.name, key, dest_bucket, dest_key ? dest_key : key, options)
11  end
12end
blog comments powered by Disqus