12 commenti php

Php è in grado di ricevere files da un form di una pagina Web e dispone una serie di funzioni e della variabile $_FILES grazie alle quali possiamo gestire le operazioni di upload e manipolazione dei file.

 

Anzitutto iniziamo dalla costruzione del form.

Ci sono due cose su cui occorre prestare attenzione: nel tag <form> occorre indicare l'istruzione enctype="multipart/form-data" e l'input il type="file".

 

Pertanto un form per eseguire l'upload di un file avrà la seguente strutture di base:

<form action="" method="post" enctype="multipart/form-data">
   <input type="file" name="upload">
   <input type="submit" name="up" value="Upload file">
</form>

 

Dopo aver selezionato il file e premuto il tasto 'Upload file' questo verrà caricato nella memoria temporanea del server.
L'analisi delle caratteristiche del file potrà essere effettuato grazia all'array globale $_FILES.

L'array $_FILE avrà la seguente struttura:

  • $_FILES["upload"]["name"]: nome del file caricato;
  • $_FILES["upload"]["type"]: tipo di file caricato (in formato MIME type);
  • $_FILES["upload"]["size"]: dimensione del file caricato;
  • $_FILES["upload"]["tmp_name"]: percorso e il nome del file temporaneo sul server;
  • $_FILES["upload"]["error"]: un codice numerico compreso fra 0 e 8 indicante il tipo di errore che si è verificato, pari a 0 in assenza di errore.


Infine analizziamo due funzioni native che consentono di gestire la procedura di upload: is_uploaded_file() e move_uploaded_file()

La funzione is_uploaded_file() verifica che il file sia stato caricato nella cartella temporanea. Essa prende come parametro il percorso e il nome del file temporaneo sul server, cioè ciò che si ottiene da $_FILES["upload"]["tmp_name"].
Restituisce un valore boleano, TRUE se il file è stato caricato; nel caso restituisce FALSE genera un errore di tipo warning.

La funzione move_uploaded_file() è la funzione che realizza concretamente l'upload in quanto sposta il file caricato dalla cartella temporanea alla cartella che noi desideriamo.
Esso prende due parametri: il primo è il percorso e il nome del file temporaneo sul server, cioè $_FILES["upload"]["tmp_name"]; il secondo è il percorso alla cartella in cui desideriamo caricare il file comprensivo del nome che desideriamo dare al file (uguale o diverso a quello originale).
La funzione restituisce un valore boleano, TRUE in caso di successo; nel caso restituisce FALSE genera un errore di tipo warning.

A questo punto abbiamo tutto ciò che ci occorre per effettuare l'upload di un file. Riportiamo uno script di esempio:

<?php  
// settiamo alcune variabili coinvolte nello script:
// 1) settiamo la cartella in cui fare l'upload
$cartella_upload ="images/";

// 2) settiamo un array in cui indichiamo il tipo di file che consentiamo l'upload
// in questo esempio solo immagini 
$tipi_consentiti = array("gif","png","jpeg","jpg"); 
  
// 3) settiamo la dimensione massima del file (1048576 byte = 1Mb)
$max_byte = 100000;


// se il form è stato inviato
if(isset($_POST['up']) and isset($_FILES["upload"]))
   {
   // verifichiamo che l'utente abbia selezionato un file
   if(trim($_FILES["upload"]["name"]) == '')
      {
      echo 'Non hai selezionato nessun file!';
      }

   // verifichiamo che il file è stato caricato
   else if(!is_uploaded_file($_FILES["upload"]["tmp_name"]) or $_FILES["upload"]["error"]>0)
      {
      echo 'Si sono verificati problemi nella procedura di upload!';
      }

   // verifichiamo che il tipo è fra quelli consentiti
   else if(!in_array(strtolower(end(explode('.', $_FILES["upload"]["name"]))),$tipi_consentiti))
      {
      echo 'Il file che si desidera uplodare non è fra i tipi consentiti!';
      }

   // verifichiamo che la dimensione del file non eccede quella massima
   else if($_FILES["upload"]["size"] > $max_byte)
      {
      echo 'Il file che si desidera uplodare eccede la dimensione massima!';
      }
	
	// verifichiamo che la cartella di destinazione settata esista
	else if(!is_dir($cartella_upload))
		{
		echo 'La cartella in cui si desidera salvare il file non esiste!';
		}
	
	// verifichiamo che la cartella di destinazione abbia i permessi di scrittura
	else if(!is_writable($cartella_upload))
		{
		echo "La cartella in cui fare l'upload non ha i permessi!";
		}
   // verifichiamo il successo della procedura di upload nella cartella settata
   else if(!move_uploaded_file($_FILES["upload"]["tmp_name"], $cartella_upload.$_FILES["upload"]["name"]))
      {
      echo 'Ops qualcosa è andato storto nella procedura di upload!';
      }

   // altrimenti significa che è andato tutto ok
   else
      {
      echo 'Upload eseguito correttamente!';
      }
   }
?>
<form action="" method="post" enctype="multipart/form-data">
   <input type="file" name="upload">
   <input type="submit" name="up" value="Upload file">
</form>

 

Vai alla lezione successiva

Vai alla lezione precedente

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

12 Commenti presenti

avatar Francesco

Francesco

04 March 2015 ore 19:24

Bellissime lezioni, ottime le spiegazioni e gli esempi...davvero un bel lavoro....grazie!

avatar Andrea

Andrea

04 October 2013 ore 20:44

Certo che puoi uploadare intere directory.

<input type="file" id="ctrl" webkitdirectory directory multiple/>

avatar oly1982

oly1982

18 July 2013 ore 08:51

@francesco: mi dispiace ma credo che non sia proprio possibile eseguire l'upload di una intera directory.

avatar Francesco

Francesco

18 July 2013 ore 00:26

Scusate, io ho un problema leggermente diverso: non ho bisogno di scegliere il file dalla tendina, ma devo uploadare tutti i files che risiedono dentro una cartella specifica. Ho provato a costruire un array contenente i nomi di quei files ma l'istruzione move_uploadad_file non funziona (e non da neanche errore, semplicemente non funge). Potete darmi qualche dritta ? Grazie

avatar oly1982

oly1982

19 April 2013 ore 15:54

@Alessandro: occorre verificare cosa c'è ai righi 26, 27, 28, 40 del tuo file filesel.php

avatar Alessandro

Alessandro

19 April 2013 ore 15:32

Ciao e grazie della guida!, purtroppo però a me da i seguenti errori nella pagina filesel.php, sono i seguenti:
Errore nell'invio del file. Riprova!
Notice: Undefined index: image in C:\xampp\htdocs\prova\filesel.php on line 26

Notice: Undefined index: image in C:\xampp\htdocs\prova\filesel.php on line 27

Notice: Undefined index: image in C:\xampp\htdocs\prova\filesel.php on line 28

Notice: Undefined index: image in C:\xampp\htdocs\prova\filesel.php on line 40
Spostamento del file fallito!

sapresti dirmi la causa? grazie

avatar fabio

fabio

01 June 2012 ore 08:51

Funziona anche sul web, è perfetto il vostro script, grazie...Avevo avuto troppa fretta e dopo qualche minuto ho notato che era arrivata l'immagine nella sua cartella.
Grazie.

avatar fabio

fabio

31 May 2012 ore 18:57

Gentile Master Tower, potrei sapere una cosa?
Sul mio server Lamp va tutto a meraviglia, dopo ho provato a fare una prova trasferendo tutto - il file uploader.php e la cartella images nello spazio di un mio sito, tramite Filezilla.
Carico e invio, mi dice che ha spedito ma dentro la cartella images non c'è nulla. Cosa sbaglio in questo caso?
Grazie per la tua cortesia...e pazienza.
Fabio
ps: hai idea di dove possa essere finita l'immagine che non ho più trovato?

avatar fabio

fabio

31 May 2012 ore 18:28

Funziona perfettamente! Stupendo!
Grazie lo stesso.
Buona serata!
Fabio

avatar oly1982

oly1982

31 May 2012 ore 08:52

Lo script deve necessariamente restituire qualche errore... quale ti compare a video?

avatar fabio

fabio

30 May 2012 ore 14:33

Domando gentilmente un aiuto.
Ho creato lo script da voi sopra spiegato e nel mio server lamp (utilizzo Ubuntu) ho creato una cartella images dopo di che ho provato a caricare una foto formato png tramite lo script ma dentro la cartella non trovo nulla! E non trovo nulla nemmeno nel cartella tmp del computer.
Potreste cortesemente spiegarmi dove devo posizionare la cartella 'images' o comunque in cosa consiste il mio sbaglio?
Grazie mille.

Fabio

avatar Master Tower

Master Tower

12 November 2011 ore 00:23

Ciao, si possono selezionare 2 cartelle su cui caricare i file?