2013-08-20 13 views
7

Stworzyłem nowe wiadro amazońskie o nazwie "zdjęcia". Wiadro url jest coś jak:Usunąć obiekt lub wiadro w Amazon S3?

www.amazons3.salcaiser.com/photos 

Teraz mogę przesłać podkatalogi zawierające pliki, w tym wiadrze na przykład

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

Moje pytania są, nie thumbs/ zakłada nową wiadro czy jest to przedmiot?

Jeśli chcę usunąć cały katalog thumbs/, muszę najpierw usunąć wszystkie pliki w tym folderze lub czy mogę usunąć wszystkie jednocześnie?

+2

nie istnieją żadne foldery w s3 chcesz usunąć wszystkie przedmioty z tego samego prefiksu –

Odpowiedz

16

W Przypadek, który opisujesz, "zdjęcia" to wiadro. S3 nie ma pod-segmentów ani katalogów. Katalogi są symulowane za pomocą ukośników w obiekcie key. "thumbs/file.jpg" jest kluczem obiektu, a "thumbs /" będzie uważane za klucz z prefiksem.

Przykłady Dagona są dobre i użyj starszej wersji 1.x pakietu AWS SDK dla PHP. Można to jednak łatwiej wykonać przy użyciu najnowszej wersji 2.4.x version AWS SDK for PHP, która zawiera metodę pomocniczą do usuwania wielu obiektów.

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

to jest całkiem niesamowite, czy wiesz, czy deleteMatchingObjects() uruchamia wiele lub pojedyncze żądanie do s3? – sbaaaang

+1

Nie można tego zrobić bez wykonywania wielu żądań. Jednak stara się zrobić tak mało, jak to tylko możliwe, wykorzystując pod maską S3 [multi-object delete API] (http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html). –

+0

dziękuję człowieku, świetne informacje! – sbaaaang

1

znaleźć kilka fragmentów kodu do usunięcia 'katalogu' - i nie pisać je:

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

Starsze 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

dziękuję za piękny kawałek kodu! z powyższego kodu widzę, że muszę wyświetlać i usuwać wszystkie obiekty, które nie są podfolderami;) – 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'; 
}