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.