удалить из S3, используя API PHP, используя подстановочный знак - PullRequest
2 голосов
/ 29 января 2012

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

Ответы [ 3 ]

8 голосов
/ 29 января 2012

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

Это возможно с помощью 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 - удаление нескольких объектов в декабре 2011 года:

Amazon S3 новый Multi-Object Delete дает вам возможность удалить до 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'),
    )
));

3 голосов
/ 30 марта 2012

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

звоните как: _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);
}
0 голосов
/ 18 сентября 2017

Если вы используете 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 объектов одновременно (см. здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...