Chargements de fichiers par m�thode POST

Cette fonctionnalit� permet aux personnes de t�l�charger � la fois du texte et des fichiers binaires. Avec les fonctions d'identification et de manipulation de fichiers de PHP, vous avez le contr�le total pour d�finir qui a le droit de t�l�charger mais aussi ce qui sera fait du fichier une fois qu'il sera t�l�charg�.

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

Note: Notes de configuration
Voir aussi les directives file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size et max_input_time dans php.ini

PHP supporte aussi le chargement par la m�thode PUT comme dans le navigateur Netscape Composer et Amaya du W3C. Reportez-vous au chapitre sur le support de la m�thode PUT.

Exemple #1 Formulaire de chargement de fichier

Un formulaire de t�l�chargement de fichiers peut �tre construit en cr�ant un formulaire sp�cifique comme ceci :

<!-- Le type d'encodage des donn�es, enctype, DOIT �tre sp�cifi� comme ce qui suit -->
<form enctype="multipart/form-data" action="_URL_" method="post">
  <!-- MAX_FILE_SIZE doit pr�c�der le champs input de type file -->
  <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
  <!-- Le nom de l'�l�ment input d�termine le nom dans le tableau $_FILES -->
  Envoyez ce fichier : <input name="userfile" type="file" />
  <input type="submit" value="Envoyer le fichier" />
</form>

_URL_ dans l'exemple pr�c�dent doit �tre remplac� et point� vers un fichier PHP.

Le champ cach� MAX_FILE_SIZE (mesur� en octets) doit pr�c�der le champ input de type file et sa valeur repr�sente la taille maximale accept�e du fichier par PHP. Il est tr�s facile de contourner cette restriction. Ne comptez pas sur le respect de cette configuration par le navigateur ! La configuration de PHP sur la taille maximale � respecter ne peut �tre contourn�e, elle. Vous devez toujours ajouter cet �l�ment de formulaire, car il pr�vient le chargement de gros fichiers qui demanderait un long d�lai d'attente au client et ainsi ferait �chouer le script.

Note: Assurez-vous que votre formulaire de t�l�chargement de fichier contienne enctype="multipart/form-data", sinon, le fichier se sera pas t�l�charg�.

La variable globale $_FILES existe depuis PHP 4.1.0 (Utilisez $HTTP_POST_FILES si vous utilisez une version plus ancienne). Ce tableau devrait contenir toutes les informations du fichier t�l�charg�.

Le contenu du tableau $_FILES est d�taill� dans notre exemple ci-dessous. Notez que l'on suppose que le nom de la variable du fichier t�l�charg� est userfile, tel que d�fini dans le formulaire ci-dessus, mais peut �tre n'importe quel nom.

$_FILES['userfile']['name']

Le nom original du fichier, tel que sur la machine du client web.

$_FILES['userfile']['type']

Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, cela pourra �tre "image/gif". Ce type mime n'est cependant pas v�rifi� du c�t� de PHP et, donc, ne prend pas sa valeur pour se synchroniser.

$_FILES['userfile']['size']

La taille, en octets, du fichier t�l�charg�.

$_FILES['userfile']['tmp_name']

Le nom temporaire du fichier qui sera charg� sur la machine serveur.

$_FILES['userfile']['error']

Le code d'erreur associ� au t�l�chargement de fichier. Cet �l�ment a �t� introduit en PHP 4.2.0.

Le fichier t�l�charg� sera stock� temporairement dans le dossier temporaire du syst�me, � moins qu'un autre dossier soit fourni avec la directive upload_tmp_dir du php.ini. Le dossier par d�faut du serveur peut �tre chang� dans l'environnement via la variable TMPDIR. Modifier la valeur de cette variable avec la fonction putenv() dans un script PHP sera sans effet. Cette variable d'environnement peut aussi �tre utilis�e pour s'assurer que d'autres op�rations fonctionnent aussi sur les fichiers t�l�charg�s.

Exemple #2 Validation de t�l�chargement de fichiers

Voyez aussi les fonctions is_uploaded_file() et move_uploaded_file() pour plus d'informations. L'exemple suivant va t�l�charger un fichier venant d'un formulaire.

<?php
// En PHP < 4.1.0, $HTTP_POST_FILES doit �tre utilis�
//    � la place de $_FILES.

$uploaddir '/var/www/uploads/';
$uploadfile $uploaddir basename($_FILES['userfile']['name']);

echo 
'<pre>';
if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo 
"Le fichier est valide, et a �t� t�l�charg�
           avec succ�s. Voici plus d'informations :\n"
;
} else {
    echo 
"Attaque potentielle par t�l�chargement de fichiers.
          Voici plus d'informations :\n"
;
}

echo 
'Voici quelques informations de d�bogage :';
print_r($_FILES);

echo 
'</pre>';

?>

Le script PHP qui re�oit le fichier charg� doit pouvoir g�rer le fichier de mani�re appropri�e. Vous pouvez utiliser la variable $_FILES['userfile']['size'] pour recaler tous les fichiers qui sont trop gros ou trop petits. Vous pouvez utiliser la variable $_FILES['userfile']['type'] pour �carter les fichiers qui n'ont pas le bon type, mais l'utiliser uniquement pour une s�rie de v�rifications, car cette valeur est compl�tement sous le contr�le du client et n'est pas v�rifi�e du c�t� de PHP. Depuis PHP 4.2.0, vous pouvez utiliser l'information dans $_FILES['userfile']['error'] et adapter votre politique en fonction des codes d'erreur. Quelque soit votre politique, vous devriez soit effacer le fichier du dossier temporaire, soit le d�placer.

Si aucun fichier n'est s�lectionn� dans le formulaire, PHP retournera 0 dans $_FILES['userfile']['size'] et rien du tout dans $_FILES['userfile']['tmp_name'].

Le fichier sera automatiquement effac� du fichier temporaire � la fin du script, s'il n'a pas �t� d�plac� ou renomm�.

Exemple #3 Envoi d'un tableau de fichiers

PHP supporte les tableaux en HTML ainsi qu'avec les fichiers.

<form action="" method="post" enctype="multipart/form-data">
<p>Images:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if (
$error == UPLOAD_ERR_OK) {
        
$tmp_name $_FILES["pictures"]["tmp_name"][$key];
        
$name $_FILES["pictures"]["name"][$key];
        
move_uploaded_file($tmp_name"data/$name");
    }
}
?>

La barre de progression de t�l�chargement peut �tre impl�ment�e par apc.rfc1867.