2012-09-20 13 views
10

Wie kopiere/dupliziere ich einen Ordner, der Unterordner und Dateien enthält, in ein anderes Verzeichnis im S3-Bucket mit PHP API?Amazon S3 kopiert das Verzeichnis in ein anderes Verzeichnis

$s3->copy_object kopiert nur den Ordner, aber nicht die darin enthaltenen Dateien und Unterordner.

Muss ich $s3->list_objects verwenden, um alle Dateien und Verzeichnisse zu erhalten und $s3->copy_object für jede einzelne Datei/jedes Verzeichnis auszuführen?

+1

+1 für die Frage. Man kann das Konzept des Ressourcenpfads S3 verstehen oder nicht, aber die Anfrage ist absolut gültig. Vielleicht ist die Frage, ob S3 unterstützt, Ressourcen intern zu kopieren (oder mehrere Pfade für die gleiche Ressource zu erstellen, warum nicht?)? Wenn es viele Dateien gibt, wäre es wirklich lächerlich, sie alle herunterladen und neu hochladen zu müssen ... – tishma

Antwort

0

Eine Möglichkeit besteht darin, Listenobjekte zu verwenden und jedes Objekt einzeln zu verschieben. Eine andere Möglichkeit ist die Verwendung von s3fuse, wodurch Ihr s3-Bucket zum lokalen Verzeichnis wird und Sie dann einfach einen einfachen Befehl wie 'mv' anwenden können, um die Dateien zu verschieben.

8

S3 ist kein Dateisystem, es ist ein Objektspeicher. Ordner existieren eigentlich nicht in einem greifbaren Sinn; Ein Ordner ist nur etwas, das Sie als freigegebenes Präfix bezeichnen können. Anders gesagt, wenn Sie path/to/one und path/to/two erstellen, führt das auch nicht dazu, dass path und path/to existieren. Wenn Sie sie sehen, liegt das daran, dass eine Komponente eine Liste von Objekten aufgenommen, ihre Schlüssel auf / aufgeteilt und entschieden hat, diese Liste als Hierarchie anzuzeigen.

Sie möchten "einen Ordner in einen anderen Ordner kopieren". Wenn Sie dies in S3-Begriffe umformulieren, möchten Sie "alle Objekte mit demselben Präfix in Objekte mit einem anderen Präfix duplizieren". Wenn Sie es so sagen, wird die Methode klar: Holen Sie sich eine Liste von Objekten mit dem einen Präfix und kopieren Sie sie dann.

0

Hier ist ein Code direkt aus Amazon genommen. Dieser Code dupliziert das Objekt drei Mal mit einem Ziel, was Sie ändern müssen, damit es jeden Schlüssel durchläuft und zum Stapel hinzufügt.

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