2012-03-11 77 views
2

我剛開始試用Amazon S3來託管我的網站圖片。我正在使用官方的Amazon AWS PHP SDK庫。使用PHP刪除亞馬遜S3中的文件夾

問題:如何刪除位於S3'文件夾'中的所有文件?例如,如果我有一個名爲images/2012/photo.jpg, I want to delete all files whose filenames start with images/2012 /`的文件。謝謝!

回答

9

S3沒有像傳統上認爲的文件夾那樣的「文件夾」(某些S3客戶端做得很好,使S3 出現有文件夾)。那些/實際上是文件名的一部分。

因此,API中沒有「刪除文件夾」選項。您只需要刪除每個具有images/2012/...前綴的文件。

更新:

這可以通過在亞馬遜S3 PHP客戶端的delete_all_objects方法來完成。只需在第二個參數(第一個參數是您的存儲桶名稱)中指定"/^images\/2012\//"作爲正則表達式前綴。

+0

是有沒有在S3庫中的任何功能可以選擇所有文件的文件名中包含特定字符串? – Nyxynyx 2012-03-11 20:03:30

+0

是通過'delete_all_objects'方法。您可以指定正則表達式來刪除與表達式匹配的存儲桶中的所有文件。文檔和示例在這裏:http://docs.amazonwebservices.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/delete_all_objects – nategood 2012-03-12 01:15:01

1

這是一個功能,將做你想要做的事情。

/** 
* This function will delete a directory. It first needs to look up all objects with the specified directory 
* and then delete the objects. 
*/ 
function Amazon_s3_delete_dir($dir){ 
    $s3 = new AmazonS3(); 

    //the $dir is the path to the directory including the directory 

    // the directories need to have a/at the end. 
    // Clear it just in case it may or may not be there and then add it back in. 
      $dir = rtrim($dir, "/"); 
      $dir = ltrim($dir, "/"); 
      $dir = $dir . "/"; 

    //get list of directories 
     $response = $s3->get_object_list(YOUR_A3_BUCKET, array(
      'prefix' => $dir 
     )); 


    //delete each 
     foreach ($response as $v) { 
      $s3->delete_object(YOUR_A3_BUCKET, $v); 
     }//foreach 

    return true; 

}//function 

用途: 如果我想刪除目錄富

Amazon_s3_delete_dir("path/to/directory/foo/"); 
+1

您可以通過一次調用delete_all_objects而不是多次調用來完成這一切。它也會更原子。 – nategood 2012-03-12 03:00:59

+0

@nategood沒有「更原子」的東西。它或者是原子的,或者不是。而這兩種解決方案都不是。 – 2012-10-09 14:49:10

+0

是的。簡明將是一個更好的術語。這個操作不是原子的。 – nategood 2012-10-16 03:07:00

10

從S3刪除文件夾及其所有文件的最佳方法是使用API​​ deleteMatchingObjects()

$s3 = S3Client::factory(...); 
$s3->deleteMatchingObjects('YOUR_BUCKET_NAME', '/some/dir'); 
+0

非常感謝luigi。你讓我的工作變得如此簡單.. :) – 2016-05-14 09:37:08

+0

Luigi,有一件事想問你,這個API deleteMatchingObjects()給出了任何成功的消息。 – 2016-05-14 09:40:37

+0

如果沒有發生異常,則表示成功。檢查deleteMatchingObjects()的返回值也是有用的,它的int值等於已刪除鍵的數量。 – 2016-05-16 07:10:36