- Home
- Categorie
- Coding e Sistemistica
- PHP
- Upload e controlli form
-
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
-
Ciao, perchè non provi questa classe per l'upload ?
LINK
Se c'è qualcosa che non capisci, posta pure;)
-
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
-
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!
-
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: vedoIl 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 bmpMa 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 bmpE 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
-
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à vuotoif(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 erroriforeach($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!
**
-
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
-
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