2012-09-20 18 views
10

Jak skopiować/zduplikować folder zawierający podfoldery i pliki do innego katalogu w obrębie zasobnika S3 przy użyciu interfejsu PHP API?Amazon S3 skopiuj katalog do innego katalogu

$s3->copy_object tylko kopiuje folder, ale nie pliki i podfoldery wewnątrz.

Czy muszę używać $s3->list_objects, aby uzyskać wszystkie pliki i katalog i uruchomić $s3->copy_object w każdym pojedynczym pliku/katalogu?

+1

+1 za pytanie. Można zrozumieć lub nie rozumieć koncepcję ścieżki dostępu S3, ale żądanie jest całkowicie poprawne. Być może pytanie brzmi, czy S3 obsługuje wewnętrznie kopiowanie zasobów (lub tworzenie wielu ścieżek dla tego samego zasobu, dlaczego nie?) W jakiś sposób? Jeśli jest dużo plików, byłoby naprawdę absurdem, aby pobrać je wszystkie i ponownie przesłać ... – tishma

Odpowiedz

0

Jednym ze sposobów jest użycie obiektów list i przeniesienie każdego obiektu jeden po drugim. Innym sposobem jest użycie s3fuse, które uczyni twoje wiadro s3 jako lokalny katalog, a następnie możesz po prostu zastosować proste polecenie, takie jak "mv", aby przenieść pliki.

8

S3 nie jest systemem plików, jest magazynem obiektów. Foldery w rzeczywistości nie istnieją w żadnym konkretnym znaczeniu; folder to coś, co można nazwać wspólnym przedrostkiem. Innymi słowy, jeśli utworzysz path/to/one i path/to/two, to nie spowoduje to również, że istnieje path i path/to. Jeśli je widzisz, to dlatego, że jakiś komponent wziął listę obiektów, podzielił ich klucze na / i zdecydował się wyświetlić tę listę jako hierarchię.

Chcesz "zduplikować folder do innego folderu". Przeformułując to na terminy S3, chcesz "zduplikować wszystkie obiekty z tym samym prefiksem do obiektów z innym prefiksem". Mówienie w ten sposób sprawia, że ​​metoda jest jasna: pobierz listę obiektów z jednym prefiksem, a następnie skopiuj każdy z nich.

0

Oto kod pobrany bezpośrednio od Amazona. Ten kod trzykrotnie powtarza przedmiot do celu, należy go zmienić tak, aby pętla przechodziła przez każdy klucz i dodawała go do partii.

<?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(); 
}