strip_tags - eliminar desde S3 usando api php usando comodín
quitar tags php (3)
Aquí se explica cómo eliminar por prefijo (tan cerca del comodín como lo he obtenido).
llamar como: _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);
}
Tengo este código de trabajo para eliminar archivos y carpetas de s3. ¿Cómo lo eliminarías usando el comodín *?
$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);
}
Presumiblemente, ¿ usar comodín * significa que quiere eliminar todos los objetos a la vez en lugar de uno a la vez?
Esto es posible a través de delete_all_objects ($ bucket, $ pcre) , donde $pcre
es una expresión regular opcional compatible con Perl (PCRE) para filtrar los nombres en contra (por defecto es PCRE_ALL
, que es "/.*/i"
), por ejemplo:
$s3 = new AmazonS3();
$response = $s3->delete_all_objects($bucket, "#myDirectory/.*#");
Elegí #
lugar de la habitual /
como el delimitador delimitador de patrón para evitar el escape (no es un problema con la barra única aquí, pero se vuelve desordenado pronto para casos más complejos), ver Delimitado para más detalles.
Nota de implementación
Tenga en cuenta que eliminar objetos múltiples no había sido posible en el pasado en el nivel de la API de Amazon S3 y simulado en AWS SDK para PHP con un bucle for dentro de delete_all_objects()
, es decir, que todavía utilizaba una solicitud por objeto; afortunadamente, Amazon finalmente presentó Amazon S3 - Multi-Object Delete en diciembre de 2011:
El nuevo Multi-Object Delete de Amazon S3 le brinda la capacidad de eliminar hasta 1000 objetos de un depósito S3 con una sola solicitud.
El soporte para S3 Multi Object Delete se ha agregado al AWS SDK para PHP poco tiempo después, según AWS SDK para PHP 1.4.8 "Zanarkand" :
La clase AmazonS3 ahora le permite eliminar múltiples objetos de Amazon S3 utilizando una única solicitud HTTP. Esto se ha expuesto como el método delete_objects () y los métodos delete_all_objects () y delete_all_object_versions () se han reescrito para aprovechar esta nueva característica de Amazon S3.
También se muestra un ejemplo para una eliminación dedicada de varios objetos (es decir, sin comodines):
$s3 = new AmazonS3();
$response = $s3->delete_objects($bucket, array(
''objects'' => array(
array(''Key'' => ''file1.txt''),
array(''Key'' => ''file2.txt''),
)
));
Si está utilizando AWS SDK para PHP v2 , puede hacer lo siguiente:
/**
* 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(),
)
);
}
Tenga en cuenta que esto funcionará actualmente para eliminar hasta 1000 objetos a la vez (ver aquí ).