2012-09-20 6 views
10

サブフォルダとファイルを含むフォルダをPHPバージョン内の別のディレクトリにコピーするにはどうすればよいですか?Amazon S3ディレクトリを別のディレクトリにコピーする

$s3->copy_objectはフォルダのみをコピーしますが、その中のファイルとサブフォルダはコピーしません。

すべてのファイルとディレクトリを取得し、すべてのファイル/ディレクトリに$s3->copy_objectを実行するには、$s3->list_objectsを使用する必要がありますか?

+1

+1です。リソースパスS3の概念を理解するかどうかは分かりませんが、要求は完全に有効です。たぶん問題は、S3が内部的にリソースをコピーすることをサポートしているか(または同じリソースの複数のパスを作成しているのはどうですか?たくさんのファイルがある場合は、それらをすべてダウンロードして再アップロードする必要があるのは本当にばかげているでしょう... – tishma

答えて

0

これを行う1つの方法は、リストオブジェクトを使用して各オブジェクトを1つずつ移動することです。別の方法はs3fuseを使用してs3バケットをローカルディレクトリとして作成し、次に 'mv'のような単純なコマンドを適用してファイルを移動することです。

8

S3はファイルシステムではなく、オブジェクトストアです。フォルダは実際にはどのような意味でも存在しません。フォルダは共有プレフィックスと呼ぶことができます。言い換えると、path/to/onepath/to/twoを作成しても、pathpath/toは存在しません。表示されるのは、一部のコンポーネントがオブジェクトのリストを取得し、/にキーを分割し、そのリストを階層として表示することにしたためです。

「別のフォルダにフォルダを複製する」とします。これをS3の言葉に置き換えて、同じ接頭辞を持つすべてのオブジェクトを別の接頭辞を持つオブジェクトに複製する必要があります。そのようにすれば、メソッドが明確になります。接頭辞が1つのオブジェクトのリストを取得し、それぞれをコピーします。

0

ここはamazonから得たコードです。このコードは、アイテムをターゲットに3回複製します。実行する必要があるのは、各キーをループしてバッチに追加するように変更することです。

<?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(); 
} 
関連する問題