2010-08-11 8 views

Respuesta

6

Utilizando el right_aws joya:

# With s3 being an S3 object acquired via S3Interface.new 
# Copies key1 from bucket b1 to key1_copy in bucket b2: 
s3.copy('b1', 'key1', 'b2', 'key1_copy') 

el Gotcha me encontré es que si usted tiene pics/1234/yourfile.jpg la bucket sólo es pics y la key es 1234/yourfile.jpg

Obtuve la respuesta desde aquí: How do I copy files between buckets using s3 from a rails application?

0

creo que con el fin de copiar entre cubos debe leer el contenido del archivo del cubo de origen y luego grabarla en el cubo de destino a través de espacio de memoria de la aplicación. Hay un fragmento que muestra esto utilizando aws-s3here y otro enfoque utilizando right_awshere

+0

me gustaría usar el fragmento de AWS-S3 pero estoy teniendo problemas al inicializar la clase AmazoneS3Asset. ¿Simplemente pongo el fragmento que define la clase en config/initializers? – deb

+0

Encontré la respuesta a mi comentario aquí http://stackoverflow.com/questions/1146946/ruby-on-rails-and-external-classes – deb

+0

aparentemente right_aws tiene esta importancia, no tuve que agregar el fragmento. Publiqué más información en la respuesta a continuación – deb

0

La joya de aws-s3 no tiene la capacidad de copiar archivos entre los depósitos sin mover los archivos a su máquina local. Si eso es aceptable para usted, entonces el siguiente trabajo:

AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket' 
25

AWS SDK-joya.S3Object#copy_to

Copies data from the current object to another object in S3. 
S3 handles the copy so the client does not need to fetch the 
data and upload it again. You can also change the storage 
class and metadata of the object when copying. 

Se utiliza copy_objectinternal método, por lo que la funcionalidad de copia le permite copiar objetos dentro o entre sus cubos S3, y opcionalmente para reemplazar los metadatos asociados con el objeto en el proceso.

método estándar (carga/descarga)

enter image description here

método Copy

enter image description here

Ejemplo de código:

require 'aws-sdk' 

AWS.config(
    :access_key_id  => '***', 
    :secret_access_key => '***', 
    :max_retries  => 10 
) 

file  = 'test_file.rb' 
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'} 
bucket_1 = {:name => 'bucket_to', :endpoint => 's3.amazonaws.com'} 

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint]) 
bucket_from  = s3_interface_from.buckets[bucket_0[:name]] 
bucket_from.objects[file].write(open(file)) 

s3_interface_to = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint]) 
bucket_to   = s3_interface_to.buckets[bucket_1[:name]] 
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from}) 
+1

Sea consciente del límite de AWS S3: 100 solicitudes/seg en todas las regiones para cargar/descargar ambas llamadas. – Anatoly

0

Me encontré con el mismo problema que tenía, así que cloné el código fuente de AWS-S3 e hice una rama que tiene un método copy_to que permite copiar entre cubos, que he estado agrupando en mis proyectos y usar cuando necesito esa funcionalidad. Con suerte, alguien más encontrará esto útil también.

View the branch on GitHub.

0

Para cualquier persona sin dejar de mirar, AWS tiene documentation para esto. En realidad es muy simple con la aws-sdk joya:

bucket = Aws::S3::Bucket.new('source-bucket') 
object = bucket.object('source-key') 

object.copy_to(bucket: 'target-bucket', key: 'target-key') 
Cuestiones relacionadas