class UploadFile extends Avvisi

Classe Pubblica con dipendenza ad Avvisi (di conseguenza anche a Session).

I Metodi:

  1. get_file()
  2. send_file()
  3. send_file_multiple()
  4. resize_image()
  5. crop_image()
  6. file_extension()

Come si può intuire questa classe permette di uplodare file dal client (nostro browser) al server (all'applicativo online).

Il suo utilizzo è molto semplice, anche se è uno dei blocchi di codice più lungo dell'intero progetto e quindi potrebbe risultare ostico nella sua lettura.

Questa classe è una rarità per RGL in quanto è l'unica a dover essere inizializzata, indicando parametri obbligatori che serviranno alla gestione del codice e dei metodi.

La classe si inizializza così:

$upload_file=new UploadFile(
    array(
        't'=>array('jpg','jpeg','gif','png'),
        's'=>'270000', 
        'w'=>'100', 
        'h'=>'100', 
        'm'=>''
    )
);

Dove:

  • t: definisce le estensioni permesse per effettuare l'upload;
  • s: non obbligatorio, permette di specificare il peso massimo di un file da uplodare;
  • w e h: si riferiscono alle sole immagini e permette di ridimensionarle;
    - se si vuole ridimensionare l'immagine inserire i valori maggiori di 0 es: '250','250'.
    - se viene inserito un solo valore numerico (ad esempio solo w), questo verrà assegnato al lato più lungo, il lato più corto sarà ridimensionato dinamicamente.
  • m: (mode) se true ridimensiona proporzionalmente i lati;

Iniziamo subito con un esempio concreto.


get_file():

Il metodo può essere utilizzato per qualunque tipologia di file, ma non tiene conto del ridimensionamento delle immagini.

Il metodo ha bisogno di 4 valori per poter funzionare,

get_file($file,$nome,$directoty,$pre_name=false)

  • $file: la variabile globale $_FILES;
  • $nome: il nome del campo input file;
  • $directory: percorso della directory nella quale uplodare il file;
  • $pre_name: assegna una stringa di testo che viene posto all'inizio del nome;

Creiamo una directory all'interno del nostro progetto, la chiameremo ./upload/ (settare sempre i permessi in scrittura e lettura!).

All'interno della nostra view:

<?php
// Codifica caratteri
header("Content-Type: text/html; charset=utf-8");
#header("Content-type: application/json");
$GLOBALS["Rgl"] = new $nameClass(
    array(
        #"Crypto", // gestione Criptazione
        "Session", // gestione delle sessioni
        "Language", // gestione delle lingue
        "Avvisi", // gestore avvisi e alert
        "Str", // trattamento delle stringhe
        #"DTime", // trattamento delle date
        "VerifySend", // verifica i dati in invio
        ##"SendMail", // invia email in vari formati
        #"DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        #"BreadC", // gestione briciole di pane
        "UploadFile", // Upload File & image
        #"LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        #"Restful" // request and response restful,
    )
);

class TestView extends TestModel {

    function view_page(){
        // creiamo un nuovo file di Log
        $upload_file=new UploadFile(
                                  array(
                                        't'=>array('jpg','jpeg','gif','png'),
                                        's'=>'270000', 
                                        'w'=>'100', 
                                        'h'=>'100', 
                                        'm'=>''
                                       )
                                   );
        $image=$upload_file->get_file($_FILES,'logo', _CONFIG_[_ROOT_].'upload/', false);

        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'test.php',
            $GLOBALS["Rgl"],
            array(
                'verifica'=>$image,
            )
        );
    }
}
TestView::view_page();
?>

Ora apriamo il nostro template e scriviamoci:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>test</title>
    </head>
    <body>
        <form class="" action="./" method="post" enctype="multipart/form-data">
            File: <br>
            <input name="logo" type="file"> <br><br>
            <button type="submit" name="invia" value="1">invia</button>
        </form>
        <?php echo Avvisi::print_message(); ?>
        <div style="text-align:center;font-weight:bold;">
            <?php echo $_['verifica'] ?>
        </div>
    </body>
</html>

Ora, con il nostro browser proviamo ad inserire un file con estensione .zip...

Verrà mostrata a video la risposta: Estensione non consentita!

Ora proviamo a caricare una immagine di tipo jpg non superiore a 2Mb.

Dovrebbe essere comparsa una dicitura simile a questa:

29082017112429_83706.jpg

Questo è il nome della nostra immagine caricata. Se volessimo distinguere un certo tipo di file da altri potremmo utilizzare il valore $pre_name come segue:

$image=$upload_file->get_file($_FILES,'logo', _CONFIG_[_ROOT_].'upload/', 'test_');

Abbiamo aggiunto la parola test_... eseguiamo un altro upload e vediamo cosa accade!

Dovremmo visualizzare qualcosa di simile:

test_29082017112841_36999.jpg

 Semplice vero? Ora vedremo invece un metodo specializzato nel trattare le immagini.


send_file():

Questo metodo è molto simile al precedente, ma è specializzato nella gestione delle immagini. Infatti i dati di larghezza e altezza inviati durante l'inizializzazione, verranno presi in considerazione dal metodo ed utilizzati per trattare l'immagine.

Spostiamoci all'interno della view e scriviamo questo codice:

$upload_file=new UploadFile(array('t'=>array('jpg','jpeg','gif','png'),'s'=>'270000', 'w'=>'100', 'h'=>'100', 'm'=>''));
$image=$upload_file->send_file($_FILES,'logo', _CONFIG_[_ROOT_].'upload/', 'image_');

Ora proviamo ad uplodare una immagine più grande di 100px.

Verifichiamo le informazioni dell'immagine ed apriamola. L'immagine è stata ridimensionata a 100*100px ma se fosse un'immagine rettangolare, questa risulterebbe deformata.

Dovremmo cambiare un'impostazione nell'inizializzazione. Cancelliamo il valore 100 dalla chiave h ed inseriamo 1 alla chiave m.

Proviamo:

$upload_file=new UploadFile(array('t'=>array('jpg','jpeg','gif','png'),'s'=>'270000', 'w'=>'100', 'h'=>'', 'm'=>'1'));
$image=$upload_file->send_file($_FILES,'logo', _CONFIG_[_ROOT_].'upload/', 'image_');

Visualizziamo l'immagine... ci sembra più coerente? bene!!!

Se avessimo la necessità di inserire più di un file per volta? Niente paura abbiamo pensato anche a questo!


send_file_multiple():

questo metodo è simile ai precedenti con qualche lieve differenza. Per funzionare correttamente avrà bisogno dei seguenti valori:

send_file_multiple($file,$n,$nome,$directoty,$pre_name=false)

  • $file: la variabile globale $_FILES;
  • $n: il risultato derivante dal ciclo for (vedere esempio);
  • $nome: il nome del campo input file;
  • $directory: percorso della directory nella quale uplodare il file;
  • $pre_name: assegna una stringa di testo che viene posto all'inizio del nome;

Ora vediamo un esempio concreto. Per prima cosa spostiamoci all'interno del nostro template e modifichiamo il campo input file aggiungendo l'attributo multiple:

<input name="logo[]" type="file" multiple>

Note: Il nome (name) dovrà essere un array.

Ora spostiamoci all'interno della nostra view e modifichiamo il codice come segue:

function view_page(){
        // creiamo un nuovo file di Log
        $image = array();
        $upload_file=new UploadFile(array('t'=>array('jpg','jpeg','gif','png'),'s'=>270000, 'w'=>100, 'h'=>'100', 'm'=>'1'));
        $total = count($_FILES['logo']['name']);
        for($i=0; $i<$total; $i++) {
            $tmpFilePath = $_FILES['logo']['tmp_name'][$i];
            if ($tmpFilePath != ""){
                $image[]=$upload_file->send_file_multiple($_FILES, $i, 'logo',  _CONFIG_[_ROOT_].'upload/', 'test_');
            }
        }
        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'test.php',
            $GLOBALS["Rgl"],
            array(
                'verifica'=>implode(", ",$image),
            )
        );
    }

Analizziamo cosa abbiamo scritto:

  1. La variabile image è un array;
  2. Inizializziamo la classe;
  3. Contiamo il numero di file inviati dal form;
  4. Eseguiamo un ciclo for;
  5. Verifichiamo che il file esista e sia presente nel ciclo;
  6. Richiamiamo il metodo send_file_multiple();

In questo caso $image restituirà un gruppo di array e non una stringa di testo contenente i nomi dei file uplodati.

Effettuiamo il test e verifichiamo che nella cartella siano stati effettivamente trasportati i file.


resize_image():

Questo metodo, permette di creare thumbnail delle immagini.

resize_image($directory, $file, $pre_name, $width=false,$height=false)

  • $directory: ha bisogno del percorso nel quale inserire l'immagine;
  • $file: il valore restituito dal metodo send_file();
  • $pre_name: inserimento di un nome prima della generazione;
  • $width: larghezza espressa in px (non obbligatorio);
  • $height: altezza espressa in px (non obbligatorio);

Il suo utilizzo è molto semplice. Vediamo all'opera.

Apriamo il file di template ed inseriamo il seguante codice all'interno del form:

<input name="logo" type="file" >

Ora apriamo la view ed inseriamo questo codice:

$upload_file = new UploadFile(array('t'=>array('jpg','jpeg','gif','png'),'s'=>'270000', 'w'=>'700', 'h'=>'', 'm'=>'1'));
$image = $upload_file->send_file($_FILES, 'logo', _CONFIG_[_ROOT_].'upload/', 'image_');
$upload_file->resize_image(_CONFIG_[_ROOT_].'upload/', $image, 'thumb_', '80', '');

Le prime due righe dovrebbero esserci familiari... la terza invece è nuova, ma non si differenzia troppo dai metodi precedenti.

  • Abbiamo inserito il percorso della directory;
  • Abbiamo inserito il valore restituiro dal metodo send_file();
  • Abbiamo attribuito un "flag" all'immagine per distinguerla dall'immagine non miniaturizzata;
  • Abbiamo detto che la larghezza dovrà essere massimo di 80px
  • Abbiamo detto  che l'altezza dovrà essere gestita automaticamente;
    Se volessimo immagini quadrate potremmo inserire sia per la larghezza che per l'altezza lo stesso valore ad esempio 80x80.

crop_image():

Questo metodo permette di ritagliare un'immagine a nostro piacimento partendo dal suo centro.

crop_image($arr, $dir, $name)

  • $arr: dovrà contenere un parametro array con chiavi w e h;
  • $dir: la directory dove prelevare l'immagine;
  • $name: Il nome del file da prelevare per essere ritagliato;

Facciamo un esempio:

$upload_file = new UploadFile(array('t'=>array('jpg','jpeg','gif','png'),'s'=>'270000', 'w'=>'700', 'h'=>'', 'm'=>'1'));
$image = $upload_file->send_file($_FILES, 'logo', _CONFIG_[_ROOT_].'upload/', 'image_');
$upload_file->crop_image(array('w'=>50,"h"=>100),_CONFIG_[_ROOT_].'upload/', $image);

Il risultato in questo caso sarà un'immagine 50px X 100px non solo ridimensionata ma anche tagliata partendo dal suo centro.


file_extension():

UploadFile::file_extension('percorso/nomefile.php.pdf')

Permette di conoscere la vera estensione di un file.

 


Lista dei Blocchi