Subir varios ficheros validados con Zend Framework

El tip de hoy es para aquellos que necesitéis subir al servidor múltiples archivos con Zend. El problema es que tenemos muchos archivos en un formulario y sólo queremos subirlos cuando todos y cada uno de ellos son correctos de acuerdo a nuestras reglas de negocio. O sea, si todos los archivos son correctos, los subimos; si no, ¡pues no los subimos!

Copiar archivos

Este upload de ficheros está estructurado en varias partes funcionales para que, llegado el caso, no tengas que romperte mucho la cabeza si luego tienes que hacer cambios importantes en la aplicación. Concretamente, supongo que dichos archivos son imágenes que nunca deben sobrepasar los 256 Kb, pero siempre puedes adaptar a tu caso la parte de la validación que se encarga de hacer tales comprobaciones.

En el cuerpo del programa principal tenemos esto:

$upload = new Zend_File_Transfer();
 
$invalidImg = validateAllImg($upload);
 
if (empty($invalidImg)) { 
    // ... 
    // Upload images     
    uploadAllImg($upload);  
}    

Simplemente creamos un objeto de tipo Zend_File_Transfer y justo después llamamos a la función validateAllImg(). Esta función de validación devuelve un array con los archivos que no cumplen las condiciones correspondientes; si todo va bien, por el contrario, el valor de dicho array es null.

function validateAllImg($upload) {     
    $invalid = Array();         
    foreach($upload->getFileInfo() as $file => $info) {         
        $upload->addValidator('Size', false, 256000)
            ->addValidator('Extension', false, array('jpg', 'jpeg', 'gif', 'png')); 
        if (!$upload->isValid($file)) $invalid[] = $file;     
    }      
    return $invalid;     
}

Si validateAllImg() devuelve null entonces procedemos a la subida de las imágenes mediante la llamada a la función uploadAllImg().

function uploadAllImg($upload) {         
    foreach($upload->getFileInfo() as $file => $info) { 
        $upload->addFilter('Rename', array('target' => APPLICATION_PATH . '/public/img/uploads/page02/'.$info['name'], 'overwrite' => true));
        $upload->receive($file);        
    }         
}

Y esto es todo por hoy, amig@s. ¡Hasta otra!