удалить из S3 с помощью api php с помощью шаблона

У меня есть этот рабочий код для удаления файлов и папок из s3. как бы вы удалили с помощью подстановочных знаков *?

$s3 = new AmazonS3(); $bucket = 'mybucket'; $folder = 'myDirectory/*';// this doesnt work $response = $s3->get_object_list($bucket, array( 'prefix' => $folder )); foreach ($response as $v) { $s3->delete_object($bucket, $v); } 

Предположительно использование подстановочного знака * означает, что вы хотите удалить все объекты одновременно, а не по одному за раз?

Это можно сделать с помощью delete_all_objects ($ bucket, $ pcre) , где $pcre является необязательным регулярным выражением Perl-совместимого (PCRE) для фильтрации имен по умолчанию (по умолчанию это PCRE_ALL , который является "/.*/i" ), например:

 $s3 = new AmazonS3(); $response = $s3->delete_all_objects($bucket, "#myDirectory/.*#"); 

Я выбрал # а не обычный / как шаблон, ограничивающий разделитель, чтобы избежать экранирования (не проблема с одной косой чертой здесь, но вскоре она становится беспорядочной для более сложных случаев), см. Раздел «Разделители» .


Замечание по реализации

Обратите внимание, что удаление нескольких объектов ранее не было возможным на уровне API Amazon S3 и смоделировано в AWS SDK для PHP с циклом for в delete_all_objects() , то есть оно использовало один запрос на объект; к счастью, Amazon наконец представила Amazon S3 – Multi-Object Delete в декабре 2011 года:

Новый Multi-Object Delete от Amazon S3 дает вам возможность удалять до 1000 объектов из ведра S3 с помощью одного запроса.

Поддержка S3 Multi Object Delete была добавлена ​​в AWS SDK для PHP вскоре после этого соответственно, см. AWS SDK для PHP 1.4.8 «Zanarkand» :

Класс AmazonS3 теперь позволяет удалять несколько объектов Amazon S3 с использованием одного HTTP-запроса. Это было показано как метод delete_objects (), и методы delete_all_objects () и delete_all_object_versions () были переписаны для использования этой новой функции Amazon S3.

Также показан пример выделенного удаления нескольких объектов (т. Е. Без подстановочных знаков):

 $s3 = new AmazonS3(); $response = $s3->delete_objects($bucket, array( 'objects' => array( array('Key' => 'file1.txt'), array('Key' => 'file2.txt'), ) )); 

Вот как удалить по префиксу (как близко к шаблону, который я получил).

вызов: _delete_by_prefix_amazon('pdfs/1-')

 /** * Delete files by folder and prefix for Amazon * * Deletes files from a service based on a prefix. * For Amazon prefix must contain folder. * * @access public * @param string prefix * @return mixed response from service api */ function _delete_by_prefix_amazon($prefix = ''){ $s3 = new AmazonS3($credentials); $objects = $s3->get_object_list($bucket, array('prefix' => $prefix)); $delete = array('objects'=>array()); foreach ($objects as $object) { $delete['objects'][]['key'] = (string)$object; } //debug($delete); return $s3->delete_objects($this->bucket, $delete); } 

Если вы используете AWS SDK для PHP v2 , вы можете сделать следующее:

 /** * Delete objects by prefix. * * @param string $bucketName The name of the bucket that you want to delete * from (ex: "mybucket"). * @param string $prefix A prefix to delete (ex: 'trash/'). * @throws \InvalidArgumentException */ function deleteByPrefix($bucketName, $prefix) { if(empty($prefix)) { throw new \InvalidArgumentException('prefix can\'t be empty'); } //get all matching objects /* @var $iterator \Aws\S3\Iterator\ListObjectsIterator */ $iterator = $this->s3Client->getListObjectsIterator( array( 'Bucket' => $bucketName, 'Prefix' => $prefix, ) ); //delete the matching objects $result = $this->s3Client->deleteObjects( array( 'Bucket' => $bucketName, 'Objects' => $iterator->toArray(), ) ); } 

Обратите внимание, что в данный момент это будет работать для удаления до 1000 объектов за раз (см. Здесь ).