2012-09-20 3 views
10

하위 폴더 및 파일이 들어있는 폴더를 PHP 버킷의 S3 버킷 내 다른 디렉토리에 복사/복제하는 방법은 무엇입니까?Amazon S3 디렉토리를 다른 디렉토리에 복사

$s3->copy_object은 폴더 만 복사하고 파일과 하위 폴더는 복사하지 않습니다.

모든 파일과 디렉토리를 얻고 모든 단일 파일/디렉토리에 $s3->copy_object을 실행하려면 $s3->list_objects을 사용해야합니까?

+1

+1입니다. 하나는 리소스 경로 S3 개념을 이해할 수도 있고 이해하지 못할 수도 있지만 요청은 완전히 유효합니다. 문제는 S3가 리소스를 내부적으로 복사하는 것을 지원하는지 (또는 동일한 리소스에 대해 여러 개의 경로를 만드는 것입니다. 이유는 무엇입니까?) 어떻게 든 말입니다. 파일이 많으면 다운로드하고 다시 업로드해야한다는 것은 정말 어리석은 일입니다. – tishma

답변

0

목록 개체를 사용하고 각 개체를 하나씩 이동하는 한 가지 방법이 있습니다. 또 다른 방법은 s3fuse를 사용하여 s3 버킷을 로컬 디렉토리로 만들고 'mv'와 같은 간단한 명령을 적용하여 파일을 이동할 수 있습니다.

8

S3는 파일 시스템이 아니며 객체 저장소입니다. 폴더는 실제로 어떤 유형의 의미로 존재하지 않습니다. 폴더는 공유 접두사라고 부를 수있는 것입니다. 다른 말로하면 path/to/onepath/to/two을 만들면 pathpath/to도 존재하지 않습니다. 일부 구성 요소가 객체 목록을 가져 와서 키를 /에 나눠서 해당 목록을 계층 구조로 표시하기로 결정한 것이 그 이유입니다.

"다른 폴더에 폴더 복제"를 원합니다. 이를 S3 용어로 바꾸어서, "같은 접두사를 가진 모든 객체를 다른 접두사를 가진 객체에 복제"하고 싶습니다. 그런 식으로 말하면 메서드가 명확 해집니다 : 하나의 접두사가있는 개체 목록을 가져온 다음 각 개체를 복사합니다.

0

여기 아마존에서 가져온 몇 가지 코드가 있습니다. 이 코드는 항목을 목표에 세 번 복제합니다. 필요한 것은 각 키를 반복하여 배치에 추가하도록 변경하는 것입니다.

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