una funzione per verificare l'invio di files

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
una funzione utile per verificare se i file che uno tenta di inviare tramite un form sono consentiti.
può verificare anche il contenuto dei file zip
PHP:
<?php
/*ATTENZIONE: valido per PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.5.0*/
/*
la funzione può servire anche per verificare il contenuto di un file .zip, con alcune limitazioni esempio
i files dentro lo zip non devono essere contenuti in una cartella, se contenuti risponde FALSE
anche se i file fossero tra quelli ammessi
poi sarebbe opprtuno non solo verificare l'estenzione dei file,
ma anche il tipo che viene riportato da $_FILE['xyz']['type']
*/
function verifica_file($file='',$fa='',$ms=0){
    //verifica impostazioni funzione
    if($file=='' || !is_array($file) || $fa=='' || !is_array($fa) || $ms==0 || $ms==NULL){
        return FALSE;
    }
    $nome_file=$file['name'];
    $nome_file_tmp=$file['tmp_name'];
    $grandezza_file=$file['size'];
    $errore=(int)$file['error'];
    if($errore!==0){return FALSE;}
    if($grandezza_file > $ms){return FALSE;}
    $est=strtolower(pathinfo($nome_file, PATHINFO_EXTENSION));
    if(!in_array($est,$fa)){return FALSE;}
    if($est!='zip'){//il file non è uno zip ed è tra gli ammessi
        return TRUE;
    }else{//il file è uno zip e quindi controllo il contenuto
        //tolgo l'estenzione zip da ammessi
        //in modo che lo zip non possa contenere a sua volta uno zip
        for($k=0; $k<count($fa);$k++){
            if($fa[$k]=='zip'){ unset($fa[$k]);}
        }
        //chiamo la classe zip
        $zip = new ZipArchive();
        //carico il file .zip nella cartella temporanea
        $cart=pathinfo($nome_file_tmp,PATHINFO_DIRNAME);//cartella del temporaneo
        $da_aprire=$cart."/$nome_file";
        if(!move_uploaded_file($nome_file_tmp, $da_aprire)){return FALSE;}//sposto lo zip in cartella temporanea
        if ($zip->open($da_aprire)!==TRUE){return FALSE;}
        //e lo esploro
        for ($j=0; $j<$zip->numFiles;$j++){
            $stat = $zip->statIndex( $j );
            $in_zip = $stat['name'];
            $tipo=strtolower(pathinfo($in_zip, PATHINFO_EXTENSION));
            if(!in_array($tipo,$fa)){
                //unset($da_aprire);//forse conviene eliminarlo subito
                return FALSE;
            }
        }
    }
    return TRUE;
}
/*---per test------------*/
if(isset($_POST['invia'])){
    $ammessi=array('jpg','gif','png','zip');
    $max_size=1000000;   
    if(verifica_file($_FILES['file'],$ammessi,$max_size)){
        echo "<p style=\"color: #0F0; \">file consentito</p>";//ecc...allego all'email
    }else{
        echo "<p style=\"color: #F00; \">file <b>NON</b> consentito</p>";//ecc...rimando dove voglio
    }
    
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input name="file" type="file" /><br />
<input name="invia" type="submit" value="invia" />
</form>
p.s.
se qualcuno ne ha voglia la trasformi in una classe e la posti e/o la migliori