2012-09-20 53 views
10

¿Cómo copio/duplico una carpeta que contiene subcarpetas y archivos en otro directorio dentro del cubo S3 utilizando PHP API?Amazon S3 copie el directorio a otro directorio

$s3->copy_object solo copia la carpeta, pero no los archivos y subcarpetas dentro.

¿Tengo que usar $s3->list_objects para obtener todos los archivos y directorios y ejecutar $s3->copy_object en cada archivo/directorio?

+1

+1 para la pregunta. Uno puede o no comprender el concepto de ruta de recursos S3, pero la solicitud es totalmente válida. Tal vez la pregunta es si S3 admite copiar recursos internamente (o crear múltiples rutas para el mismo recurso, ¿por qué no?) De alguna manera? Si hay muchos archivos, sería realmente ridículo tener que descargarlos todos y volver a subir ... – tishma

Respuesta

0

Una forma de hacerlo es usar objetos de lista y mover cada objeto uno por uno. Otra forma es usar s3fuse, que convertirá su depósito s3 en el directorio local y luego puede simplemente aplicar un comando simple como 'mv' para mover los archivos.

8

S3 no es un sistema de archivos, es un almacén de objetos. Las carpetas en realidad no existen en ningún sentido tangible; una carpeta es algo que puedes llamar un prefijo compartido. Dicho de otra forma, si crea path/to/one y path/to/two, tampoco significa que existen path y path/to. Si los ve, es porque algún componente tomó una lista de objetos, dividió sus claves en / y decidió mostrar esa lista como una jerarquía.

Quiere "duplicar una carpeta en otra carpeta". Al reformular esto en términos de S3, quiere "duplicar todos los objetos con el mismo prefijo en objetos con un prefijo diferente". Diciéndolo de esa manera aclara el método: obtenga una lista de objetos con un prefijo, luego cópielos.

0

aquí hay algunos códigos tomados directamente de amazon. Este código duplica el elemento tres veces al objetivo, lo que debe hacer es cambiarlo para que pase por cada tecla y lo agregue al lote.

<?php 

// Include the AWS SDK using the Composer autoloader. 
require 'vendor/autoload.php'; 

use Aws\S3\S3Client; 

$sourceBucket = '*** Your Source Bucket Name ***'; 
$sourceKeyname = '*** Your Source Object Key ***'; 
$targetBucket = '*** Your Target Bucket Name ***'; 

// Instantiate the client. 
$s3 = S3Client::factory(); 

// Copy an object. 
$s3->copyObject(array(
    'Bucket'  => $targetBucket, 
    'Key'  => "{$sourceKeyname}-copy", 
    'CopySource' => "{$sourceBucket}/{$sourceKeyname}", 
)); 

// Perform a batch of CopyObject operations. 
$batch = array(); 
for ($i = 1; $i <= 3; $i++) { 
    $batch[] = $s3->getCommand('CopyObject', array(
     'Bucket'  => $targetBucket, 
     'Key'  => "{$sourceKeyname}-copy-{$i}", 
     'CopySource' => "{$sourceBucket}/{$sourceKeyname}", 
    )); 
} 
try { 
    $successful = $s3->execute($batch); 
    $failed = array(); 
} catch (\Guzzle\Service\Exception\CommandTransferException $e) { 
    $successful = $e->getSuccessfulCommands(); 
    $failed = $e->getFailedCommands(); 
}