2014-01-24 72 views
3

任何人都可以幫助我解決這個問題.. ??AWS s3下載特定文件夾內的所有文件 - 使用PHP SDK

我想從我的存儲桶文件夾內的文件夾下載所有文件到我的計算機的同名目錄中。

比方說,有一個水桶名字「ABC」的文件夾是存在的裏面,是「DEF」。在哪個文件夾中有多個可用的文件..

現在我想將它下載到我的項目文件夾「/ opt/lampp/htdocs/porject/files/download /」這裏的「DEF」文件夾也是可用的..

所以,任何人都可以幫助我,並給我這個代碼..?

在此先感謝..

=============

錯誤:

致命錯誤:未捕獲的異常 'UnexpectedValueException' 有消息「RecursiveDirectoryIterator :: _ construct()[recursivedireiteiterator .-- construct]:無法找到封裝器" s3 " - 您是否忘記在配置PHP時啓用它?在/opt/lampp/htdocs/demo/amazon-s3/test.php:21堆棧跟蹤:#0 /opt/lampp/htdocs/demo/amazon-s3/test.php(21):RecursiveDirectoryIterator-> _construct( 's3:// bucketname/folder ...')#1 {main}在第21行拋出/opt/lampp/htdocs/demo/amazon-s3/test.php

回答

2

使用Amazon S3流很簡單包裝:

include dirname(__FILE__) . '/aws.phar'; 
$baseDirectory = dirname(__FILE__) .'/'.$myDirectoryName; 


$client = \Aws\S3\S3Client::factory(array(
    'key' => "<my key>", 
    'secret' => "<my secret>" 
)); 

$client->registerStreamWrapper(); 


$bucket = 's3://mys3bucket/' . $myDirectoryName 

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($bucket), 
    RecursiveIteratorIterator::SELF_FIRST 
); 

foreach($iterator as $name => $object) { 
    if ($object->getFileName() !== '.' && $object->getFileName() !== '..') { 
     $relative = substr($name,strlen($bucket)+1); 
     if (!file_exists($baseDirectory . '/' . $path . '/' . $relative)) { 
      if ($object->isDir()) { 
       mkdir($baseDirectory . '/' . $path . '/' . $relative, 0777, true); 
      } else { 
       file_put_contents(
        $baseDirectory . '/' . $path . '/' . $relative, 
        file_get_contents($name) 
       ); 
      } 
     } 
    } 
} 
+0

$ bucket ='s3:// mys3bucket /'。 $ myDirectoryName。拋出錯誤..多數民衆贊成在不工作..編輯與錯誤的答案.. –

+0

它拋出什麼錯誤?錯誤消息旨在幫助識別問題,而不是簡單地導致開發人員的惡化;所以它實際上知道他們是什麼是有用的 –

+0

如果這是我認爲它是,你真的應該能夠診斷,我錯過了一個';'當我輸入這個答案 –

20

馬克的回答是完全有效的,但也有一個更簡單的方法與AWS SDK的PHP using the downloadBucket() method做到這一點。下面是一個例子(假設$client是S3客戶端的一個實例):

$bucket = 'YOUR_BUCKET_NAME'; 
$directory = 'YOUR_FOLDER_OR_KEY_PREFIX_IN_S3'; 
$basePath = 'YOUR_LOCAL_PATH/'; 

$client->downloadBucket($basePath . $directory, $bucket, $directory); 

有關此方法的很酷的事情是,它排隊只不存在(或沒有被修改)的文件在本地目錄中,並嘗試並行下載它們,以加快整個下載時間。該方法有第4個參數(請參閱鏈接),其中包含其他選項,例如設置一次要發生多少個並行下載。

+2

您的答案是非常簡單,易於實施 –

相關問題