• User

    Upload e controlli form

    Ciao,
    volevo tornare sul discorso degli upload per capire meglio questa cosa:

    ho un form che richiede dei campi input text e alcuni upload di files.

    Ho messo i controlli per i campi obbligatori/errati dei campi POST e FILES e avverto se c'è qualcosa che non va.
    Se va tutto bene il record viene registrato nel DB. Ma se c'è il messaggio di errore devo ripresentare il modulo per la correzione.
    I campi POST me li ripresenta eventualmente per la modifica, ma i FILES come li posso gestire? Io pensavo di fare l'upload vero e proprio solo quando non c'erano più errori nel form, come faccio a non perdere i file che ho già inserito? Grazie!!

    Patpat


  • User Attivo

    Ciao, perchè non provi questa classe per l'upload ?
    LINK
    Se c'è qualcosa che non capisci, posta pure;)


  • User

    Ciao ilnetsurfer!
    Ho provato la tua classe per l'upload e volevo chiederti questo:
    supponi che i file che devi caricare siano 2.
    Il mio dubbio sta in $this->link, perchè se i file sono ok va bene, ma se 1 dei 2 ad esempio non è dell'estensione giusta come faccio a mantenere anche $this->link del file giusto al precedente upload?
    Li vorrei vedere entrambi perchè li voglio registrare sul db... registrazione che faccio solo quando tutti i campi del form (anche quelli S_POST) sono ok
    Che cosa mi sfugge?
    Grazie
    Ciao
    Patpat


  • User Attivo

    Allora...puoi fare così :

    [PHP]<?php
    ##################################

    PHP CLASS 1.2

    CLASSE PER L'UPLOAD

    TUTORIAL E GUIDA ALL'USO

    IL NET-SURFER

    ##################################

    $max_file_size = 102400;//Dimensione massima di un file.102400 Bytes = 100 KiloByte;1024 Bytes = 1 KiloByte
    $image_type = array('jpeg', 'jpg', 'png', 'gif', 'bmp'); //Estensioni accettate.Badate bene di scriverle in minuscolo!
    if(isset($_FILES['file'])){//Se esiste $_FILES
    require "class.upload.php";//includiamo la classe
    $obj = new upload($_FILES['file'],"car/",$max_file_size,$image_type); //Inizializziamo la classe!
    /*Il primo parametro è il file
    il secondo la cartella con le immagini(E ricordate di inserire / dopo il nome);
    Il terzo parametro è il limite massimo di grandezza dei files
    il quarto parametro è l'array contenente le estensioni accettate
    */
    }
    if(isset($_FILES['file2'])){//carichiamo la seconda img
    $image_type_2 = Array("jpg","raw");
    $obj2 = new upload($_FILES['file2'],"car/",$max_file_size,$image_type); //Inizializziamo la classe!
    }
    ?>

    <?php
    echo "Estensioni accettate : ";//Scrive, tramite foreach, tutte le estensioni accettate
    foreach($image_type as $type){
    echo $type." ";
    }
    ?>
    <form enctype="multipart/form-data" action="index.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>" />
    <input type="file" name="file" /><br />
    <input type="file" name="file2" />
    <input type="submit" name="upload" value="Upload">

    </form>[/PHP]
    Facendo così, obj e obj2 sono le due classi inizializzate!
    Il problema non si pone, in quanto ogni inizializzazione è una cosa a se.
    Poi, se vuoi il link, devi semplicemente usare $obj->link oppure $obj2->link...
    Il nome della variabile inizializzata più ->link!


  • User

    Ciao, grazie per la tua risposta!
    Spero di non essere troppo pesante ;), ma anche con il codice che mi hai indicato tu succede quello che ti ho descritto prima:
    se inserisco i due file senza errori il problema non esiste: vedo

    Il link della tua immagine : ...localhost/prova/car/img1.jpg
    Il link della tua immagine : ...localhost/prova/car/img2.jpg
    Estensioni accettate : jpeg jpg png gif bmp

    Ma supponi di inserire il primo file giusto e il secondo con l'estensione sbagliata allora ho:

    Il link della tua immagine : ...localhost/prova/car/img1.jpg
    Sono stati riscontrati i seguenti errori : Estensione non accetta!

    Dopo di che se inserisco solo il secondo file:

    Sono stati riscontrati i seguenti errori : Non è stato selezionato alcun file!
    Il link della tua immagine : ...localhost/prova/car/img2.jpg Estensioni accettate : jpeg jpg png gif bmp

    E il primo file giusto non è più disponibile per la registrazione nel DB.

    Che ne pensi? Vorrei solo capire come si deve trattare questo tipo di problema... grazie mille per la tua disponibilità

    Patpat


  • User Attivo

    Beh,allora bisogna solo modificare un pochino la classe...Così :
    [PHP]
    <?php

    ##################################

    PHP CLASS 1.2

    CLASSE PER L'UPLOAD

    TUTORIAL E GUIDA ALL'USO

    IL NET-SURFER

    ##################################
    class upload{//Il nome della classe
    public $files;//Variabile pubblica di classe contenente il file
    public $dir;//Variabile pubblica di classe contenente la cartella
    public $max_size;//Variabile pubblica di classe contenente la dimensione massima dei files
    public $ext;//Variabile pubblica di classe contenente l'estensione del file
    public $ammissed_ext;//Variabile pubblica di classe contenente l'array con le estensioni accettate
    public $error;//Variabile pubblica di classe contenente gli errori
    public $complete;//Variabile pubblica di classe contenente il path sul disco dell'immagine
    public $link;//Variabile pubblica di classe contenente l'URL dell'immagine
    public $my_err;//Variabile pubblica di classe contenente l'errore finale
    function load($esito,$err = ""){//Funzione load .Prevede due variabili :
    //esito(true o false, true se non c'è errore, false se c'è);
    //Err : se esito è false allora dentro contiene l'errore.Altrimenti sarà vuoto

    if(empty($err) && $esito = true){//Se non ci sono errori e l'esito è ok

    $this->error = "";
    if(!$this->is_ammissed_file()){ //Qui si fa uso di una funzione interna alla classe
    //Con $this->miafunc(); apriamo la funzione.Se la classe è statica utilizzeremo self::miafunc();
    $this->error[] = "Estensione non accetta!";//Aggiungiamo un errore nell'array
    }

    if(empty($this->error)){
    {
    $this->files['name'] = str_ireplace(" ","_",$this->files['name']);//Eliminiamo gli spazi e sostituiamoli con -

    $id = 0;
    if(file_exists($this->dir.$id."".$this->files['name'])){//Se esiste il file con quel nome..
    while(file_exists($this->dir.$id."
    ".$this->files['name'])){//Finchè esiste il file con quel nome...

    $id++;//incrementa l'id
    $this->complete = $this->dir.$id."_".$this->files['name']; //Crea il file con il nome : n_nomefile.ext dove n sta per un numero

    }

    if(!@move_uploaded_file($this->files['tmp_name'],$this->complete)){ //Se l'upload è andato a buon fine...

    $this->error[] = "Impossibile copiare il file nella directory";

    }
    $this->link = "http://".$_SERVER['SERVER_NAME'].substr($SERVER['REQUEST_URI'],0,-9).$this->complete; //Crea il link!
    }else{//Se non esiste un file con quel nome...
    if(!@move_uploaded_file($this->files['tmp_name'],$this->dir.$id."
    ".$this->files['name']))//Upload!
    {

    $this->error[] = "Impossibile copiare il file nella directory";

    }
    $this->link = "http://".$_SERVER['SERVER_NAME'].substr($SERVER['REQUEST_URI'],0,-9).$this->dir.$id."".$this->files['name'];
    }

    }

    }
    else{
    $this->error[] = $err;//Altrimenti aggiunge l'errore
    }

    }
    $this->no_error() ? print($this->link):die("Sono stati riscontrati i seguenti errori :
    ".$this->my_err);
    }

    function set_file_ext($_resource_file_name){//Funzione che restituisce l'estensione del file

    $ext_file = explode("." , $_resource_file_name);//Dividiamo la stringa in tante parti quante sono i punti + 1
    //ES: $stringa = "ciao.mi.chiamo.valerio";
    //$stringa_array = explode(".",$stringa);
    //$stringa contiene:
    //$stringa[0] = "ciao"
    //$stringa[1] = "mi"
    //$stringa[2] = "chiamo"
    //$stringa[3] = "valerio"
    $count_ext_files = count($ext_file)-1;//Contiamo il numero di elementi nell'array
    //ES: $array = Array("Ciao","xx","xxxx","jjb");
    //$count = count($array);
    //Restituisce 4
    $myext = $ext_file[$count_ext_files];
    return $myext;//La funzione darà come risultato l'estensione

    }

    function is_ammissed_file(){//Funzione che restituisce true o false se l'estensione dei file è accettata
    $this->ext = $this->set_file_ext($this->files['name']); //Tramite la nostra funzione creata prima settiamo l'estensione
    if(in_array(strtolower($this->ext),$this->ammissed_ext))//Se l'estensione è contenuta nell'array della estensioni(con la funzione strtolower tutti i caratteri diventano in minuscolo(es .PHP diventa .php)
    {
    return true;//Restituisce true
    }else{
    return false;//Restituisce false
    }

    }

    function __construct($files,$dir,$max_size,$ammissed_ext){// __construct, funzione che parte alla dichiarazione della classe
    //Da notare l'uso di $this->files invece di $files
    // la variabile globale di classe $this-> si usa nelle funzioni della classe
    //nelle classi di tipo statico non si utilizza $this-> ma self::
    //Assegnamo ad ogni variabile di classe il rispettivo contenuto
    $this->files = $files;
    $this->dir = $dir;
    $this->max_size = $max_size;
    $this->ammissed_ext = $ammissed_ext;
    switch($this->files['error'])

                       {   //Fa uno switch degli errori presenti all'interno della variabile error di $this->files
    

    case UPLOAD_ERR_NO_FILE://Se non è stato selezionato alcun file...
    $this->error[] = "Non è stato selezionato alcun file!";
    $this->load(false,$this->error);
    break;

    case UPLOAD_ERR_INI_SIZE://Se si superano le dimensioni massime secondo php.ini...
    $this->error[] = "è stato riscontrato un errore!Il file è troppo grande secondo le impostazioni del file php.ini!";
    $this->load(false,$this->error);
    break;

    case UPLOAD_ERR_FORM_SIZE://Se si superano le dimensioni massime di max_file_size...
    $this->error[] = "Le dimensioni superano il valore massimo consentito!";
    $this->load(false,$this->error);
    break;

    case UPLOAD_ERR_PARTIAL://Se si riscontra un errore nell'upload...
    $this->error[] = "è stato riscontrato un errore nell'upload!";
    $this->load(false,$this->error);
    break;

    case UPLOAD_ERR_OK://Nessun errore
    $this->load(true);
    break;

    default: //S c'è un errore sconosciuto...
    $this->error[] = "è stato riscontrato un errore sconosciuto!";
    $this->load(false,$this->error);
    break;
    }

                       }
    

    function no_error(){ //Funzione che controlla se ci sono errori
    if(!empty($this->error)){//Se $this->error (variabile di classe) non è vuoto, vuol dire che ci sono errori

    foreach($this->error as $err){//Scorre l'array ...
    $this->my_err .= $err."<br />"; //E lo riempe!
    }
    return false;
    }else{ //Altrimenti...
    $this->link = "Il link della tua immagine : <a href = "".$this->link."">".$this->link."</a>";
    return true;
    }

    }
    }

    ?>
    [/PHP]

    Ho modificato solo questa parte :

    [PHP] $this->no_error() ? print($this->link):die("Sono stati riscontrati i seguenti errori :
    ".$this->my_err);[/PHP]**

    Ola!:ciauz:
    **


  • User

    Ciao ilnetsurfer!
    Non ne vengo proprio a capo. 😮

    Ora sono a questo punto:

    Il link della tua immagine : ..localhost/prova/car/img1.jpg
    Sono stati riscontrati i seguenti errori : Non è stato selezionato alcun file!

    Ma per inserire il secondo e mantenere il primo?
    :bho:

    Ciao Patpat


  • User

    Ciao !

    Credo di sbagliare proprio la logica del problema.
    Si deve separare l'upload delle immagini dalla associazione ad un DB?
    Cioè se carico l'immagine di un prodotto ad esempio
    prima faccio l'upload
    poi nell'inserimento dei dati del prodotto scelgo l'immagine relativa ma già caricata?

    Ciao

    Patpat