У меня есть этот рабочий код для удаления файлов и папок из 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 объектов за раз (см. Здесь ).