使用通配符使用api php从S3中删除

时间:2012-01-29 15:25:42

标签: php api amazon-s3

我有这个工作代码从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 个答案:

答案 0 :(得分:8)

大概使用通配符* 意味着你想一次删除所有对象而不是一次删除一个对象?

这可以通过delete_all_objects($bucket, $pcre)实现,其中$pcre是一个可选的 Perl兼容正则表达式(PCRE)来过滤名称(默认为PCRE_ALL"/.*/i"),例如:

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

我选择#而不是通常的/作为包含分隔符的模式以避免转义(这里没有单斜杠的问题,但是对于更复杂的情况,它会很快变得混乱),有关详细信息,请参阅Delimiters


实施说明

请注意,过去在Amazon S3 API级别无法删除多个对象,并在AWS SDK for PHP中使用delete_all_objects()内的for循环进行模拟,即每次使用一个请求对象仍然;幸运的是,亚马逊终于在2011年12月推出了Amazon S3 - Multi-Object Delete

  

Amazon S3's新的多对象删除功能使您能够执行此操作   使用单个请求从S3存储桶中删除最多1000个对象。

S3 Multi Object Delete 的支持已经添加到 AWS SDK for PHP 之后不久,请参阅AWS SDK for 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'),
    )
));

答案 1 :(得分:3)

以下是如何通过前缀删除(尽可能接近通配符)。

调用如:_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);
}

答案 2 :(得分:0)

如果您使用的是AWS SDK for 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个对象(请参阅here)。