2013-08-20 216 views
7

我創建了一個名爲「照片」的新亞馬遜桶。桶網址是一樣的東西:在Amazon S3中刪除對象或存儲桶?

www.amazons3.salcaiser.com/photos 

現在我上傳包含文件的子文件夾,成桶例如

www.amazons3.salcaiser.com/photos/thumbs/file.jpg 

我的問題是,它假設一個新桶thumbs/還是一個對象?

那麼如果我想刪除整個thumbs/目錄需要我先刪除裏面的所有文件,或者我可以一次刪除所有文件嗎?

+2

有在S3中沒有文件夾時,你會刪除所有對象具有相同前綴的 – 2013-08-20 23:29:16

回答

16

在你正在描述的情況下,「照片」是存儲桶。 S3沒有子桶或目錄。通過在對象中使用斜槓來模擬目錄。 「thumbs/file.jpg」是一個對象鍵,「thumbs /」將被認爲是一個鍵前綴

Dagon的例子很好,使用適用於PHP的AWS SDK的舊版本1.x。但是,您可以使用最新的2.4.x version AWS SDK for PHP更輕鬆地完成此操作,其中包含一個用於刪除多個對象的輔助方法。

<?php 

// Include the SDK. This line depends on your installation method. 
require 'aws.phar'; 

use Aws\S3\S3Client; 

$s3 = S3Client::factory(array(
    'key' => 'your-aws-access-key', 
    'secret' => 'your-aws-secret-key', 
)); 

// Delete the objects in the "photos" bucket with the a prefix of "thumbs/" 
$s3->deleteMatchingObjects('photos', 'thumbs/'); 
+0

這是相當可怕的,你知道如果deleteMatchingObjects()啓動多個或單個請求到S3? – sbaaaang

+1

沒有可能的方式來執行此操作而不執行多個請求。但是,它通過使用S3的[多對象刪除API](http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html)嘗試儘可能少地做到這一點。 –

+0

謝謝你,很棒的信息! – sbaaaang

1

發現了一些代碼段爲 '目錄' 刪除 - 我沒有寫出來:

PHP 5.3+:

$s3 = new AmazonS3(); 

$bucket = 'your-bucket'; 
$folder = 'folder/sub-folder/'; 

$s3->get_object_list($bucket, array(
    'prefix' => $folder 
))->each(function($node, $i, $s3) { 
    $s3->batch()->delete_object($bucket, $node); 
}, array($s3)); 
$responses = $s3->batch()->send(); 

var_dump($responses->areOK()); 

較早的PHP 5.2.x:

$s3 = new AmazonS3(); 


$bucket = 'your-bucket'; 
$folder = 'folder/sub-folder/'; 

$s3->get_object_list($bucket, array(
    'prefix' => $folder 
))->each('construct_batch_delete', array($s3)); 

function construct_batch_delete($node, $i, &$s3) 
{ 
    $s3->batch()->delete_object($bucket, $node); 
} 

$responses = $s3->batch()->send(); 

var_dump($responses->areOK()); 
+0

感謝你可愛的一段代碼!從上面的代碼我可以看到我需要列出並刪除所有不是子文件夾的對象;) – sbaaaang

3
//Include s3.php file first in code 

if (!class_exists('S3')) 
      require_once('S3.php'); 
     //AWS access info 
     if (!defined('awsAccessKey')) 
      define('awsAccessKey', 'awsAccessKey'); 
     if (!defined('awsSecretKey')) 
      define('awsSecretKey', 'awsSecretKey'); 
     //instantiate the class 
     $s3 = new S3(awsAccessKey, awsSecretKey); 

    if ($s3->deleteObject("bucketname", `filename`)) { 
     echo 'deleted'; 
} 
else 
{ 
echo 'no file found'; 
}