我有这个工作代码从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);
}
答案 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)。