2013-08-20 36 views
7

Ho creato un nuovo secchio amazzone chiamato "foto". L'url secchio è qualcosa di simile:Elimina oggetto o bucket in Amazon S3?

www.amazons3.salcaiser.com/photos 

Ora caricare sottocartelle contenenti file, in quel secchio per esempio

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

Le mie domande sono, non thumbs/ si presume un nuovo secchio o è un oggetto?

Quindi, se voglio eliminare l'intera directory thumbs/, devo prima cancellare tutti i file al suo interno o posso eliminare tutto in una volta?

+2

non ci sono cartelle in s3 si sarebbe eliminare tutti gli oggetti con lo stesso prefisso –

risposta

16

Nel caso che stai descrivendo, "foto" è il secchio . S3 non ha sotto-bucket o directory. Le directory sono simulate utilizzando le barre nell'oggetto chiave. "thumbs/file.jpg" è un oggetto chiave e "thumbs /" sarebbe considerato un prefisso chiave .

Gli esempi di Dagon sono buoni e utilizzano la versione precedente 1.x dell'SDK AWS per PHP. Tuttavia, puoi farlo più facilmente con il nuovissimo 2.4.x version AWS SDK for PHP che include un metodo di supporto per l'eliminazione di più oggetti.

<?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

questo è abbastanza impressionante, sai se deleteMatchingObjects() lancia richieste multiple o singole a s3? – sbaaaang

+1

Non è possibile eseguire questa operazione senza eseguire più richieste. Tuttavia, cerca di fare il meno possibile usando l'API [multi-object delete API] di S3 (http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html) sotto il cofano. –

+0

grazie amico, ottime informazioni! – sbaaaang

1

trovato alcuni frammenti di codice per l'eliminazione 'directory' - non ho scritto di loro:

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

più vecchio 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

grazie per il bel pezzo di codice! dal codice sopra posso vedere ho bisogno di elencare ed eliminare tutti gli oggetti che non sono sottocartelle;) – 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'; 
} 
Problemi correlati