Le langage PHP 4 dispose de plusieurs outils facilitant le téléchargement vers le serveur et la gestion des fichiers provenant d'un client.
Un simple formulaire comportant un champ input de type file suffit au téléchargement d'un fichier qui subséquemment, devra être traité par un script PHP adapté.
<form method="POST" action="traitement.php" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="Taille_Octets"> <input type="file" name="fichier" size="30"><br> <input type="submit" name="telechargement" value="telecharger"> </form> |
Un champ caché doit être présent dans le formulaire afin de spécifier une taille maximum (MAX_FILE_SIZE) pour le fichier à télécharger. Cette taille est par défaut égale à deux mégaoctets.
En PHP 4, le tableau associatif global $HTTP_POST_FILES ou $_FILES contient plusieurs informations sur le fichier téléchargé à condition que l'option de configuration track_vars soit activée dans le fichier php.ini.
La valeur error a été introduite à partir de la version 4.2.0.
PHP 3 quant à lui, peut faire appel aux variables globales ou/et au tableau associatif globale $HTTP_POST_VARS à condition que respectivement les options de configuration register_globals et/ou track_vars soient activées dans le fichier php.ini.
Par défaut, le fichier envoyé par le client est stocké directement dans le répertoire indiqué par l'option de configuration upload_tmp_dir dans le fichier php.ini.
upload_tmp_dir = c:\PHPuploadtemp
La méthode putenv() permet de modifier pour la durée du script, l'emplacement du dossier temporaire.
putenv('upload_tmp_dir=/idsite/temp');
Plusieurs fonctions spécialisées permettent la validation d'un fichier téléchargé pour son utilisation ultérieure.
La fonction is_uploaded_file indique si le fichier a bien été téléchargé par la méthode HTTP POST.
$booleen = is_uploaded_file($_FILES['fichier']['tmp_name']);
La fonction move_uploaded_file vérifie si le fichier a été téléchargé par la méthode HTTP POST, puis si c'est le cas le déplace vers l'emplacement spécifié.
$booleen = move_uploaded_file($_FILES['fichier']['tmp_name'], "c:\temporaire\fichier_telecharge\");
Il est possible de télécharger plusieurs fichiers en même temps, en utilisant des crochets à la suite du nom du champ afin d'indiquer que les informations relatives aux fichiers seront stockées dans un tableau.
<form action="traitement.php" method="POST" enctype="multipart/form-data"> <input type="file" name="fichier[]"><br> ... <input type="file" name="fichierN[]"><br> <input type="submit" value="Envoyer" name="soumission"> </form> ... for($i = 0; $i < sizeof($_FILES['fichier']['name']); $i++) { echo "Nom du fichier : " . $_FILES['fichier']['name'][$i]; }
Les fichiers téléchargés sont automatiquement effacés du répertoire temporaire au terme du script. Ainsi, il est nécessaire de déplacer les fichiers vers un autre endroit ou de les renommer si ceux-ci doivent être conservés.
Exemple [voir]<!-- Fichier : formulaire.html --> <html> <body> <form method="POST" action="traitement.php" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> <input type="file" name="fichier" size="30"><br> <input type="submit" name="telechargement" value="telecharger"> </form> </body> </html> <?php // Fichier : traitement.html $repertoire = "f:\PHP\uploadtemp"; if (is_uploaded_file($HTTP_POST_FILES['fichier']['tmp_name'])) { $fichier_temp = $HTTP_POST_FILES['fichier']['tmp_name']; echo "<h3>Le fichier a été téléchargé avec succès " . "à l'emplacement suivant : <br>'" . $fichier_temp . "'</h3>"; $nom_fichier = $HTTP_POST_FILES['fichier']['name']; echo "<h3>Le nom d'origine du fichier est '" . $nom_fichier . "'.</h3>"; echo "<h3>Le type du fichier est '" . $HTTP_POST_FILES['fichier']['type'] . "'.</h3>"; echo "<h3>La taille du fichier est de '" . $HTTP_POST_FILES['fichier']['size'] . " octets'.</h3>"; copy($HTTP_POST_FILES['fichier']['tmp_name'], $repertoire . $nom_fichier); } else { echo '<h3 style="color:#FF0000">ATTENTION, ce fichier peut être à l'origine' . ' d'une attaque : ' . $HTTP_POST_FILES['fichier']['name'] . "!</h3>"; } ?> |