9
votes

Supprimer le dossier en Amazon S3 en utilisant php

Je viens de commencer à essayer Amazon S3 pour avoir hébergé les images de mon site Web. J'utilise la bibliothèque officielle Amazon AWS PHP SDK.

problème: Comment puis-je supprimer tous les fichiers situés dans un "dossier" S3?
Par exemple, si j'ai un fichier nommé images / 2012 / photo.jpg , je souhaite supprimer tous les fichiers dont les noms de fichiers commencent par images / 2012 / .


0 commentaires

5 Réponses :


10
votes

S3 n'a pas de "dossiers", car vous penseriez traditionnellement d'eux sur un système de fichiers (certains clients S3 font juste une belle tâche à la tâche S3 apparaissent avoir des dossiers). Ces / font réellement partie du nom de fichier.

En tant que tel, il n'y a pas d'option "Supprimer dossier" dans l'API. Vous auriez juste besoin de supprimer chaque fichier individuel qui possède le code images / 2012/2 / code> préfixe.

mise à jour:

Ceci peut être accompli via la méthode delete_all_Objects dans le client PHP Amazon S3. Simplifiez simplement "/ ^ images \ / 2012 \ //" comme préfixe de regex dans le deuxième argument (le premier argument étant votre nom de godet).


2 commentaires

Y a-t-il des fonctions dans la bibliothèque S3 qui peut sélectionner tous les fichiers avec une chaîne particulière dans leur nom de fichier?


Oui via la méthode delete_all_Objects . Vous pouvez spécifier une expression régulière à utiliser pour supprimer tous les fichiers d'un godet correspondant à l'expression. Docs et exemples ici: docs.amazonwebservices.com/awssdkforphp/latest / ...



-1
votes

Voici une fonction qui fera ce que vous cherchez à faire.

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


4 commentaires

Vous pouvez accomplir tout cela avec un seul appel à delete_all_objects au lieu de plusieurs appels. Ce serait aussi plus atomique.


@natetégood il n'y a pas de "plus atomique". C'est atomique ou non. Et les deux solutions ne sont pas.


Oui. Concis serait un terme meilleur. Cette opération n'est pas atomique.


Down voté car avec plusieurs demandes, vous pouvez simplement exploser la limite de demande. Il y a une ligne commune à faire cela au lieu de pourach.



27
votes

Le meilleur moyen de supprimer un dossier de S3 avec tous ses fichiers utilise l'API SupprenetematchingObjects () CODE>

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


6 commentaires

Merci beaucoup de Luigi. Vous faites mon travail si facile .. :)


Luigi, une chose que vous voulez vous demander, cette API DeletematcheringObjects () donne un message de réussite.


Si aucune exception n'est soulevée, cela signifie succès. Il peut également être utile de vérifier la valeur de retour de SupprimeringObjects () qui est un Int est égal au nombre de touches supprimées.


Notez juste une chose. Si vous avez un fichier nommé DIRXXX.JPG dans le répertoire "Certains" qui supprimera également le fichier. Donc ce n'est pas correct. Vous devrez ajouter une regex. $ S3-> Supprimer DeletematchingObjects ('Your_Bucket_Name', '/ SOI / DIR', '/ ^ Quelque \ / dir \ //');


Bonne observation. Ma solution était basée sur le fait que vous ne mélangez généralement pas de fichiers et de dossiers au même niveau, mais les fichiers sont généralement stockés au niveau final de chaque hiérarchie.


Cela a fonctionné mais il ne supprime que des fichiers et non des dossiers. par exemple. Si vous avez un dossier comptes / 100 / galerie / et dans lequel vous avez des fichiers .. Ensuite, effectuez $ S3-> Supprimer deletematchjects ('your_bucket_name', '/ 100'); < / code> supprimerait tous les fichiers mais les répertoires resteraient toujours.



-1
votes

J'ai testé cela et cela fonctionne 2019-05-28

$delPath = $myDir . $theFolderName . "/";        
Amazon_s3_delete_dir($delPath, $s3, $bucket);


0 commentaires

0
votes
$s3 = new Aws\S3\Client([ 'region' => 'us-west-2', 'version' => 'latest' ]); 
$listObjectsParams = ['Bucket' => 'foo', 'Prefix' => 'starts/with/']; 

// Asynchronously delete 
$delete = Aws\S3\BatchDelete::fromListObjects($s3, $listObjectsParams); 

// Force synchronous completion $delete->delete();
$promise = $delete->promise(); 

0 commentaires