Form di Trasferimento di un file (lato client)

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


Script per acquisire un file (lato server)

<?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


Limitazioni ai file da trasferire

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.


Salvare il file acquisito (lato server)

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