Manuel PHP
Précédent |  | Suivant

# Chapitre 34. 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 textes ou binaires. 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.

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

Notez bien que 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.

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

Exemple 34-1. Formulaire de chargement de fichier

    <form enctype="multipart/form-data" action="_URL_" method="post">
     <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
     Envoyez ce fichier : <input name="userfile" type="file" />
     <input type="submit" value="Envoyer 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 en octets du fichier à charger. Assurez-vous également que votre formulaire de chargement a bien enctype="multipart/form-data" sinon, le chargement ne fonctionnera pas.

Avertissement

Le champ MAX_FILE_SIZE est là à titre de conseil au navigateur, bien que PHP va également l'utiliser. 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 (upload_max_filesize) ne peut être contournée, elle. Vous devez ajouter la variable MAX_FILE_SIZE à votre formulaire dans tous les cas car il prévient le chargement de gros fichiers qui demanderait un long délai d'attente au client et ainsi fera échouer le script.

Les variables définies après un téléchargement de fichiers diffèrent beaucoup de version en version. La variable $_FILES existe depuis PHP 4.1.0. Le tableau $HTTP_POST_FILES existe depuis PHP 4.0.0. Ces tableaux contiennent toutes les données sur les fichiers téléchargés. L'utilisation de la variable $_FILES est recommandée. Si la directive PHP register_globals vaut on, les variables reliées existeront aussi. register_globals vaut par défaut off depuis PHP 4.2.0.

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

$_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 error code associé au téléchargement de fichier. ['error'] a été introduit en PHP 4.2.0

> Note : Dans les versions de PHP antérieure à la version 4.1.0, la variable $_FILES s'appelait $HTTP_POST_FILES et ce n'était pas une variable auto-globale comme l'est $_FILES. PHP 3 ne supporte pas $HTTP_POST_FILES.

Lorsque register_globals vaut on dans le `php.ini`, des variables supplémentaires sont rendues disponibles. Par exemple $userfile_name vaut $_FILES['userfile']['name'], $userfile_type vaut $_FILES['userfile']['type'], etc. Gardez à l'esprit que depuis PHP 4.2.0, register_globals vaut off par défaut. Il n'est pas prudent de supposer que cette directive vaut on.

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 34-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/';
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
echo "Le fichier est valide, et a été téléchargé
avec succès. Voici plus d'informations :\n";
print_r($_FILES);
} else {
echo "Attaque par upload potentielle. Voici plus d'informations :\n";
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 recaler les fichiers qui n'ont pas le bon type. Depuis PHP 4.2.0, vous pouvez utiliser l'information dans $_FILES['userfile']['error'] et adapter votre politique en fonction des code 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é.

Précédent | Sommaire | Suivant
Utiliser les XForms | Niveau supérieur | Explication sur les messages d'erreurs de chargement de fichiers