Chapitre suivantIndex des CoursChapitre précedentChapitre 15

Gestion des chargements de fichier

 

Chargements de fichiers par méthode POST

PHP est capable de recevoir des fichiers émis par un navigateur conforme à la norme RFC-1867 (c'est à dire Netscape Navigator 3 ou supérieur, Microsoft Internet Explorer 3 avec un patch de Microsoft, ou supérieur sans le patch). Cette fonctionnalité permet de charger des fichiers texte binaire. Avec l'authentification et les fonctions de manipulation des fichiers, vous avez un contrôle total sur le chargement et la gestion des fichiers chargés.

Notez bien que PHP supporte aussi le chargement par la méthode PUT comme dans le navigateur Netscape Composer et les clients Amaya du W3C. Allez voir à Support de la méthode PUT pour plus de détails.

Un écran de chargement de fichiers peut être constitué en créant un formulaire de la manière suivante :

Exemple 15-1. Formulaire de chargement de fichiers

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Envoyez le fichier suivant : <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Envoie le fichier ">
</FORM>

Le paramètre _URL_ doit pointer sur un fichier PHP. L'option MAX_FILE_SIZE cachée doit précéder le nom du fichier à charger, et représente la taille maximale du fichier à charger. La valeur est donnée en octets. Dans ce script, les valeurs suivantes doivent être définies pour assurer un chargement correct :

•  $userfile --> Le nom temporaire du fichier qui sera chargé sur la machine serveur.

•  $userfile_name --> Le nom du fichier original sur le système de l'envoyeur.

•  $userfile_size --> La taille envoyée en octets.

•  $userfile_type --> Le type mime du fichier, si le navigateur a fourni cette information. Par exemple, "image/gif".

•  Notez que $userfile prend la valeur qui est passée dans le champs INPUT de type TYPE=file. Dans l'exemple ci dessus, nous avons choisi de l'appeler "userfile".

•  Les fichiers seront enregistrés par défaut dans le dossier temporaire du système. Ceci peut être changé en modifiant la variable d'environnement TMPDIR de l'environnement dans lequel PHP fonctionne. Vous pouvez modifier cette valeur depuis PHP même, avec la fonction putenv() .

•  Le script PHP qui reçoit le fichier chargé doit pouvoir gérer le fichier de manière appropriée. Par exemple, si $file_size est trop grande, vous pouvez retourner une erreur au navigateur, et annuler le chargement. Vous pouvez aussi utiliser la variable $file_type pour retourner une erreur si le type de fichier n'est pas le bon.

•  Le fichier sera effacé du dossier temporaire à la fin du script, s'il n'a pas été déplacé ou renommé.

Erreurs communes

Le champs MAX_FILE_SIZE ne peut pas spécifier une valeur de taille supérieure à la taille maximale spécifiée dans la configuration de upload_max_filesize dans le fichier PHP3.ini ou dans la directive php3_upload_max_filesize du fichier Apache .conf. Par défaut, elle vaut 2 Mega-octets.

NB : le serveur httpd du CERN semble supprimer tout ce qui commence par un espace blanc dans le type de contenu mime de l'entête qu'il reçoit du client. Aussi longtemps que ce sera le cas, CERN httpd ne supportera pas le chargement de fichier PHP.

Chargement multiples de fichiers

Il est possible de charger plusieurs fichiers en même temps, et recevoir les informations adéquates organisées sous forme de tableau. Pour ce faire, il faut utiliser la même syntaxe d'envoi dans le code HTML que pour les sélections ou boite à cocher multiples.

Note: Le support du chargement multiple de fichier a été ajouté dans la version 3.0.10.

Exemple 18-2. Chargement multiple de fichier

<form action="file-upload.html" method="post" enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Send files">
</form> 

Lorsque le formulaire ci dessus est envoyé, les tableaux $userfile, $userfile_name, et $userfile_size seront initialisés (et $HTTP_POST_VARS aussi). Chaque tableau sera de type numérique, et contiendra les valeurs appropriées pour le chargement des fichiers.

Par exemple, si on veut envoyer les fichiers /home/test/review.html et /home/test/xwp.out, $userfile_name[0] contiendra review.html, et $userfile_name[1] contiendra xwp.out. De même, , $userfile_size[0] contiendra la taille de filesize, etc

Chargement par méthode PUT

PHP supporte la méthode HTTP PUT utilisée par les navigateurs tels que Netscape Composer et W3C Amaya. Les requêtes de type PUT sont beaucoup plus simples que les chargements de fichiers, et elles ressemblent à :

PUT /path/filename.html HTTP/1.1

Normalement, cela signifie que le client distant va sauver les données qui suivent dans le fichier: /path/filename.html de votre disque. Ce n'est évidemment pas très sécurisé de laisser Apache ou PHP écraser n'importe quel fichier de l'arborescence. Pour éviter ceci, il faut d'abord dire au serveur que vous voulez qui un script PHP donné gère la requête. Avec Apache, il y a une directive pour cela : Script. Elle peut être placée n'importe où dans le fichier de configuration d'Apache. En général, les webmestres la place dans le block <Directory>, ou peut être dans le bloc <Virtualhost>. La ligne suivante fera très bien l'affaire :

Script PUT /put.php

Elle indique à Apache d'envoyer les requêtes de chargement par méthode PUT au script put.php. Bien entendu, cela présuppose que vous avez activé PHP prend en charge les fichiers de type .php, et que PHP est actif.

Dans le fichiers.php file vous pouvez mettre ceci :

<? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>

Ce script va copier le fichier chargé par le client distant à l'endroit désiré. Vous aurez probablement à effectuer quelques tests et des authentifications d'utilisateur, avant d'effectuer cette copie. Le seul piège est que lorsque PHP reçoit un chargement par méthode PUT, il va enregistrer le fichier dans le dossier temporaire, tout comme avec la méthode POST-method . A la fin de la requête, le fichier sera effacé. Ce qui fait que ce script doit placer le fichier chargé quelque part. Le nom du fichier temporaire est placé dans la variable globale $PHP_PUT_FILENAME, et la destination prévue est placée dans $REQUEST_URI (ces noms peuvent changer d'une configuration d'Apache à l'autre). Cette destination est celle qui est demandée par le client, et vous n'avez pas à obéir aveuglément au client. Vous pourriez par exemple, déplacer le fichier dans un dossier de chargement.

 

Chapitre précedentIndex des CoursChapitre suivant

Révisé le :23-Jan-2008| ©2008 www.technologuepro.com