15 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.

15 Commenti presenti

avatar GuidaPHP.it

GuidaPHP.it

15 January 2020 ore 02:55

@Marco:

La formattazione non funziona bene, il link al sito è questo https://guidaphp.it/base/variabili-superglobali/files

avatar GuidaPHP.it

GuidaPHP.it

15 January 2020 ore 02:53

@Marco:

Ciao Marco,

dai un'occhiata alla guida [url href=https://guidaphp.it/base/variabili-superglobali/files]Upload PHP[/url] che ho realizzato personalmente.

Al paragrafo Upload multiplo è spiegato come gestire il caricamento di più file in una volta con un solo pulsante.

avatar Marco

Marco

20 March 2019 ore 17:34

Ho provato a fare un upload di un singolo file e tutto funziona. Riseleziono un altro file e anche questo viene trasferito sul server. Il mio problema è che volevo mettere una sequenza di 3 tag input e in ogni riga selezionare un file diverso. Inoltre ad ogni riga è presente un tasto di upload. Ho provato in vari modi ma non riesco proprio ad ottenere alcun risultato che funzioni correttamente.
Grazie per l'eventuale aiuto

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?