TigerZF
🌐Español

34.3. Filtros para Zend_File_Transfer

Zend_File_Transfer se entrega con varios filtros relacionados con archivos que pueden usarse para automatizar varias tareas que suelen realizarse con archivos. Tenga en cuenta que los filtros de archivo se aplican después de la validación. Además, los filtros de archivo se comportan de forma ligeramente distinta a otros filtros. Siempre devolverán el nombre del archivo y no el contenido modificado (lo cual sería una mala idea al trabajar con archivos de 1 GB). Todos los filtros que se proporcionan con Zend_File_Transfer se pueden encontrar en el componente Zend_Filter y se denominan Zend_Filter_File_*. Los siguientes filtros están actualmente disponibles:

  • Decrypt: Este filtro puede descifrar un archivo cifrado.

  • Encrypt: Este filtro puede cifrar un archivo.

  • LowerCase: Este filtro puede convertir a minúsculas el contenido de un archivo de texto.

  • Rename: Este filtro puede renombrar archivos, cambiar la ubicación e incluso forzar la sobrescritura de archivos existentes.

  • UpperCase: Este filtro puede convertir a mayúsculas el contenido de un archivo de texto.

34.3.1. Uso de filtros con Zend_File_Transfer

El uso de filtros es bastante sencillo. Existen varios métodos para agregar y manipular filtros.

  • addFilter($filter, $options = null, $files = null): Añade el filtro dado a la pila de filtros (opcionalmente solo al archivo o archivos especificados). $filter puede ser una instancia real de filtro, o un nombre corto que especifique el tipo de filtro (por ejemplo, 'Rename').

  • addFilters(array $filters, $files = null): Añade los filtros dados a la pila de filtros. Cada entrada puede ser un par tipo/opciones de filtro, o un array con la clave 'filter' que especifica el filtro (todas las demás opciones se considerarán opciones del filtro para su instanciación).

  • setFilters(array $filters, $files = null): Sobrescribe cualquier filtro existente con los filtros especificados. Los filtros deben seguir la sintaxis de addFilters().

  • hasFilter($name): Indica si se ha registrado un filtro.

  • getFilter($name): Devuelve un filtro previamente registrado.

  • getFilters($files = null): Devuelve los filtros registrados; si se pasa $files, devuelve los filtros para ese archivo en particular o conjunto de archivos.

  • removeFilter($name): Elimina un filtro previamente registrado.

  • clearFilters(): Elimina todos los filtros registrados.

Ejemplo 34.30. Añadir filtros a una transferencia de archivos

$upload = new Zend_File_Transfer();

// Establece una nueva ruta de destino
$upload->addFilter('Rename', 'C:\picture\uploads');

// Establece una nueva ruta de destino y sobrescribe los archivos existentes
$upload->addFilter('Rename',
                   array('target' => 'C:\picture\uploads',
                         'overwrite' => true));

Ejemplo 34.31. Limitar filtros a archivos individuales

addFilter(), addFilters(), y setFilters() aceptan cada uno un argumento final $files. Este argumento puede usarse para especificar un archivo particular o un array de archivos sobre los que aplicar el filtro dado.

$upload = new Zend_File_Transfer();

// Establece una nueva ruta de destino y la limita solo a 'file2'
$upload->addFilter('Rename', 'C:\picture\uploads', 'file2');

Generalmente debería usar simplemente el método addFilters(), que puede llamarse varias veces.

Ejemplo 34.32. Añadir varios filtros

A menudo es más sencillo simplemente llamar a addFilter() varias veces. Una llamada por cada filtro. Esto también aumenta la legibilidad y hace que su código sea más mantenible. Como todos los métodos ofrecen una interfaz fluida, puede encadenar las llamadas como se muestra a continuación:

$upload = new Zend_File_Transfer();

// Establece un tamaño de archivo de 20000 bytes
$upload->addFilter('Rename', 'C:\picture\newjpg', 'file1')
       ->addFilter('Rename', 'C:\picture\newgif', 'file2');

[Note] Nota

Tenga en cuenta que, aunque está permitido establecer el mismo filtro varias veces, hacerlo puede ocasionar problemas al usar diferentes opciones para el mismo filtro.

34.3.2. Filtro Decrypt

El filtro Decrypt permite descifrar un archivo cifrado.

Este filtro hace uso de Zend_Filter_Decrypt. Admite las extensiones Mcrypt y OpenSSL de PHP. Consulte la sección relacionada para obtener detalles sobre cómo establecer las opciones para el descifrado y qué opciones se admiten.

Este filtro admite una opción adicional que puede usarse para guardar el archivo descifrado con otro nombre de archivo. Establezca la opción filename para cambiar el nombre de archivo donde se almacenará el archivo descifrado. Si omite esta opción, el archivo descifrado sobrescribirá el archivo cifrado original.

Ejemplo 34.33. Uso del filtro Decrypt con Mcrypt

$upload = new Zend_File_Transfer_Adapter_Http();

// Añade un filtro para descifrar el archivo cifrado subido
// con mcrypt y la clave mykey
$upload->addFilter('Decrypt',
    array('adapter' => 'mcrypt', 'key' => 'mykey'));

Ejemplo 34.34. Uso del filtro Decrypt con OpenSSL

$upload = new Zend_File_Transfer_Adapter_Http();

// Añade un filtro para descifrar el archivo cifrado subido
// con openssl y las claves proporcionadas
$upload->addFilter('Decrypt',
    array('adapter' => 'openssl',
          'private' => '/path/to/privatekey.pem',
          'envelope' => '/path/to/envelopekey.pem'));

34.3.3. Filtro Encrypt

El filtro Encrypt permite cifrar un archivo.

Este filtro hace uso de Zend_Filter_Encrypt. Admite las extensiones Mcrypt y OpenSSL de PHP. Consulte la sección relacionada para obtener detalles sobre cómo establecer las opciones para el cifrado y qué opciones se admiten.

Este filtro admite una opción adicional que puede usarse para guardar el archivo cifrado con otro nombre de archivo. Establezca la opción filename para cambiar el nombre de archivo donde se almacenará el archivo cifrado. Si omite esta opción, el archivo cifrado sobrescribirá el archivo original.

Ejemplo 34.35. Uso del filtro Encrypt con Mcrypt

$upload = new Zend_File_Transfer_Adapter_Http();

// Añade un filtro para cifrar el archivo subido
// con mcrypt y la clave mykey
$upload->addFilter('Encrypt',
    array('adapter' => 'mcrypt', 'key' => 'mykey'));

Ejemplo 34.36. Uso del filtro Encrypt con OpenSSL

$upload = new Zend_File_Transfer_Adapter_Http();

// Añade un filtro para cifrar el archivo subido
// con openssl y las claves proporcionadas
$upload->addFilter('Encrypt',
    array('adapter' => 'openssl',
          'public' => '/path/to/publickey.pem'));

34.3.4. Filtro LowerCase

El filtro LowerCase permite cambiar a minúsculas el contenido de un archivo. Solo debería usar este filtro en archivos de texto.

En la inicialización puede indicar una cadena que se usará como codificación. O puede usar el método setEncoding() para establecerla posteriormente.

Ejemplo 34.37. Uso del filtro LowerCase

$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('MimeType', 'text');

// Añade un filtro para convertir a minúsculas el archivo de texto subido
$upload->addFilter('LowerCase');

// Añade un filtro para convertir a minúsculas el archivo subido pero solo para uploadfile1
$upload->addFilter('LowerCase', null, 'uploadfile1');

// Añade un filtro para convertir a minúsculas con codificación establecida en ISO-8859-1
$upload->addFilter('LowerCase', 'ISO-8859-1');

[Note] Nota

Tenga en cuenta que, debido a que las opciones para el filtro LowerCase son opcionales, debe indicar NULL como segundo parámetro (las opciones) cuando desee limitarlo a un único elemento de archivo.

34.3.5. Filtro Rename

El filtro Rename permite cambiar el destino de la subida, el nombre de archivo y también sobrescribir archivos existentes. Admite las siguientes opciones:

  • source: El nombre y destino del archivo antiguo que se va a renombrar.

  • target: El nuevo directorio, o nombre de archivo del archivo.

  • overwrite: Establece si el archivo antiguo sobrescribe al nuevo si ya existe. El valor predeterminado es FALSE.

Adicionalmente también puede usar el método setFile() para establecer archivos, lo que elimina todos los establecidos previamente, addFile() para añadir un nuevo archivo a los existentes, y getFile() para obtener todos los archivos realmente establecidos. Para simplificar las cosas, este filtro entiende varias notaciones y tanto los métodos como el constructor entienden las mismas notaciones.

Ejemplo 34.38. Uso del filtro Rename

$upload = new Zend_File_Transfer_Adapter_Http();

// Establece una nueva ruta de destino para todos los archivos
$upload->addFilter('Rename', 'C:\mypics\new');

// Establece una nueva ruta de destino solo para uploadfile1
$upload->addFilter('Rename', 'C:\mypics\newgifs', 'uploadfile1');

Puede usar diferentes notaciones. A continuación se muestra una tabla en la que encontrará una descripción y la intención de las notaciones admitidas. Tenga en cuenta que cuando use el Adaptador o el Elemento de formulario no podrá usar todas las notaciones descritas.

Tabla 34.1. Diferentes notaciones del filtro rename y su significado

notación descripción
addFile('C:\uploads') Especifica una nueva ubicación para todos los archivos cuando la cadena dada es un directorio. Tenga en cuenta que obtendrá una excepción si el archivo ya existe; vea el parámetro overwrite.
addFile('C:\uploads\file.ext') Especifica una nueva ubicación y nombre de archivo para todos los archivos cuando la cadena dada no se detecta como directorio. Tenga en cuenta que obtendrá una excepción si el archivo ya existe; vea el parámetro overwrite.
addFile(array('C:\uploads\file.ext', 'overwrite' => true)) Especifica una nueva ubicación y nombre de archivo para todos los archivos cuando la cadena dada no se detecta como directorio y sobrescribe un archivo existente con el mismo nombre de destino. Tenga en cuenta que no recibirá ninguna notificación de que un archivo fue sobrescrito.
addFile(array('source' => 'C:\temp\uploads', 'target' => 'C:\uploads')) Especifica una nueva ubicación para todos los archivos en la ubicación anterior cuando las cadenas dadas se detectan como directorios. Tenga en cuenta que obtendrá una excepción si el archivo ya existe; vea el parámetro overwrite.
addFile(array('source' => 'C:\temp\uploads', 'target' => 'C:\uploads', 'overwrite' => true)) Especifica una nueva ubicación para todos los archivos en la ubicación anterior cuando las cadenas dadas se detectan como directorios y sobrescribe un archivo existente con el mismo nombre de destino. Tenga en cuenta que no recibirá ninguna notificación de que un archivo fue sobrescrito.

34.3.6. Filtro UpperCase

El filtro UpperCase permite cambiar a mayúsculas el contenido de un archivo. Solo debería usar este filtro en archivos de texto.

En la inicialización puede indicar una cadena que se usará como codificación. O puede usar el método setEncoding() para establecerla posteriormente.

Ejemplo 34.39. Uso del filtro UpperCase

$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('MimeType', 'text');

// Añade un filtro para convertir a mayúsculas el archivo de texto subido
$upload->addFilter('UpperCase');

// Añade un filtro para convertir a mayúsculas el archivo subido pero solo para uploadfile1
$upload->addFilter('UpperCase', null, 'uploadfile1');

// Añade un filtro para convertir a mayúsculas con codificación establecida en ISO-8859-1
$upload->addFilter('UpperCase', 'ISO-8859-1');

[Note] Nota

Tenga en cuenta que, debido a que las opciones para el filtro UpperCase son opcionales, debe indicar NULL como segundo parámetro (las opciones) cuando desee limitarlo a un único elemento de archivo.