L'utente riceve un form contenente un pulsante per sfogliare le cartelle sul proprio computer e selezionare il file da inviare al server web. Il form è il seguente:
<form method="post" action="schedaLink.php" enctype="multipart/form-data"></span>
<table border=1>
<tr>
<td>Nome del file locale<br />da trasferire:</td>
<td><input type="file" name="fileDaTrasfe"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Trasferisci"></td>
</tr>
</table>
</form>
L'attributo enctype del tag form specifica quale tipo di contenuto si deve usare quando si trasmettono i dati del form. il tipo multipart/form-data viene usato quando un form invia dati binari, come ad esempio un file exe o jpg.
L'attributo type="file" del tag input specifica che accanto alla casella deve apparire il pulsante per sfogliare le cartelle e scegliere il file da trasmettere
<?php
if ($_FILES["fileDaTrasfe"]["error"] > 0) {
echo "Errore: ".$_FILES["fileDaTrasfe"]["error"]."<br />";
} else {
echo "File Ricevuto: ".$_FILES["fileDaTrasfe"]["name"]."<br />";
echo "Content-type: ".$_FILES["fileDaTrasfe"]["type"]."<br />";
echo "Dimensione: ".($_FILES["fileDaTrasfe"]["size"] / 1024)." Kb<br />";
echo "Nome file temporaneo: ".$_FILES["fileDaTrasfe"]["tmp_name"];
}
?>
Le informazioni relative al file ricevuto sono disponibili nell'array bidimensionale $_FILES
Il primo indice dell'array è il nome della casella di testo, mentre il secondo indice può assumere uno tra i valori: "name", "type", "size", "tmp_name" o "error".
Riepilogo:
$_FILES["fileDaTrasfe"]["name"] - il nome del file ricevuto
$_FILES["fileDaTrasfe"]["type"] - il content-type del file ricevuto
$_FILES["fileDaTrasfe"]["size"] - la dimensione in byte del file ricevuto
$_FILES["fileDaTrasfe"]["tmp_name"] - il nome del file temporaneo memorizzato sul server web
$_FILES["fileDaTrasfe"]["error"] - il codice di errore prodotto dal trasferiemnto
Il form e lo script insieme rappresentano il modo più semplice per trasferire un file. L'utente potrebbe trasferire file eseguibili e poi mandarli in esecuzione provocando comportamenti illeciti del server
Se la pagina deve ospitare foto o imamgini, le sole estensioni ammesse solo quelle relative ai formati grafici. Ad esempio se si consente immagini in formato gif, il seguente script acquisisce il file solo se il content-type è image/gif e se il file ha dimensione inferiore a 10K:
<?php
if ((($_FILES["fileDaTrasfe"]["type"] == "image/gif")
|| ($_FILES["fileDaTrasfe"]["type"] == "image/jpeg")
|| ($_FILES["fileDaTrasfe"]["type"] == "image/pjpeg"))
&& ($_FILES["fileDaTrasfe"]["size"] < 10000)) {
if ($_FILES["fileDaTrasfe"]["errore"] > 0) {
echo "Errore: " . $_FILES["fileDaTrasfe"]["error"] . "<br />";
} else {
echo "nome file: " . $_FILES["fileDaTrasfe"]["name"] . "<br />";
echo "Content-type: " . $_FILES["fileDaTrasfe"]["type"] . "<br />";
echo "Dimensione: " . ($_FILES["fileDaTrasfe"]["size"] / 1024) . " Kb<br />";
echo "copia temporanea: " . $_FILES["fileDaTrasfe"]["tmp_name"];
}
} else {
echo "file non ammesso";
}
?>
Nota: IE riconosce il formato jpg se il content-type è: pjpeg, FireFox invece accetta jpeg.
Durante il trasferimento in upload del file il server crea una copia temporanea del file nella cartella php/temp
Le copie temporanee vengono eliminate al termine dell'esecuzione dello script. Quindi il file deve essere copiato in una posizione diversa prima che lo script termini.
<?php
if ((($_FILES["fileDaTrasfe"]["type"] == "image/gif")
|| ($_FILES["fileDaTrasfe"]["type"] == "image/jpeg")
|| ($_FILES["fileDaTrasfe"]["type"] == "image/pjpeg"))
&& ($_FILES["fileDaTrasfe"]["size"] < 20000)) {
if ($_FILES["fileDaTrasfe"]["error"] > 0) {
echo "codice di errore: ".$_FILES["fileDaTrasfe"]["error"]."<br />";
} else {
echo "Nome File: ".$_FILES["fileDaTrasfe"]["name"]."<br />";
echo "Content-type: ".$_FILES["fileDaTrasfe"]["type"]."<br />";
echo "Dimensione: ".($_FILES["fileDaTrasfe"]["size"] / 1024)." Kb<br />";
echo "copia temporanea: " . $_FILES["fileDaTrasfe"]["tmp_name"] . "<br />";
if (file_exists("upload/".$_FILES["fileDaTrasfe"]["name"])) {
echo $_FILES["fileDaTrasfe"]["name"] . " già esiste. ";
} else {
move_uploaded_file($_FILES["fileDaTrasfe"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "copia temporanea: " . "upload/" . $_FILES["file"]["name"];
}
}
} else {
echo "file non ammesso";
}
?>
Lo script precedente controlla se il file esiste nella cartella di destinazione, che in questo esempio è denominata upload