
L'envoi de fichier (upload) grâce à un
formulaire HTML peut-être géré par le langage
PHP.
Formulaire d'envoi de fichiers
La première chose à faire consiste à créer un formulaire HTML permettant à l'utilisateur d'ouvrir une boîte de dialogue permettant de choisir le fichier à envoyer :
<form method="post" action="[votre fichier PHP pour l'upload.php]" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<input type="file" name="nom_du_fichier">
<input type="submit" value="Envoyer">
</form>
Il est impératif de ne pas oublier l'attribut
enctype="multipart/form-data" ! Le cas échéant, le formulaire n'aurait aucun effet.
Par ailleurs le champ MAX_FILE_SIZE est une indication de la taille maximum du fichier à uploader pour le navigateur, mais cela n'est pas suffisant pour s'assurer que les fichiers uploadés ne dépasseront pas une certaine taille: c'est une limite fixée sur l'ordinateur client (du visiteur). Rien n'empèche d'envoyer un fichier plus gros a partir d'un autre formulaire sans cette sécurité. Pour avoir une limite fiable, il est impératif de fixer une limite coté
serveur, afin que celui-ci refuse de recevoir un fichier trop volumineux. De plus, tous les les navigateurs ne prennent pas systématiquement en compte cette valeur. La valeur de la taille maximale du fichier uplodé est donc ajustable "en dur" dans le fichier de configuration php.ini sur le serveur. L'unité concernant la taille maximum du fichier est l'
octet.
Configuration de PHP pour permettre l'upload
Le fichier de configuration php.ini permet la configuration du serveur
PHP. Il contient entre autres des directives permettant d'autoriser ou non l'envoi de fichiers via un formulaire ainsi que de le paramétrer :
file_uploads= On/Off permet d'autoriser ou non l'envoi de fichiers.
upload_tmp_dir = répertoire permet de définir le répertoire temporaire permettant d'accueillir le fichier uploadé.
upload_max_filesize = 2M permet de définir la taille maximale autorisée pour le fichier. Si cette limite est dépassée, le serveur enverra un code d'erreur.
post_max_size indique la taille maximale des données envoyées par un formulaire. Cette directive prime sur upload_max_filesize, il faut donc s'assurer d'avoir post_max_size supérieure à upload_max_filesize
Si vous n'avez pas accès à la configuration (cas d'un site hébergé sur le serveur du fournisseur d'accès ou dans le cas d'un hébergement mutualisé), vous pouvez vérifier la configuration grâce à la fonction phpinfo() :
<?php
phpinfo();
?>
Récupération du fichier avec PHP
Le fichier, ainsi que les informations le concernant, sont accessibles via la variable superglobale $_FILES[].
Pour afficher son contenu, vous pouvez utiliser le script suivant :
<pre><?php print_r($_FILES); ?></pre>
La sortie de ce code sera de la forme suivante :
Array
(
[nom_du_fichier] => Array
(
[name] => MaBelleImage.jpg
[type] => image/jpg
[tmp_name] => chemin_complet_du_fichier_uploadé
[error] => 0
[size] => 1000
)
)
Dans le cas ci-dessus il s'agit d'une image JPEG pesant 1 Mo.
Les champs $_FILES[name], $_FILES[type], $_FILES|error], $_FILES[size] permettent d'effectuer des tests sur le type de fichier, sa taille, son nom et vérifier s'il y a eu des erreurs.
Ainsi, vous pouvez traiter les erreurs de la manière suivante :
<?php
if ($_FILES['nom_du_fichier']['error']) {
switch ($_FILES['nom_du_fichier']['error']){
case 1: // UPLOAD_ERR_INI_SIZE
echo"Le fichier dépasse la limite autorisée par le serveur (fichier php.ini) !";
break;
case 2: // UPLOAD_ERR_FORM_SIZE
echo "Le fichier dépasse la limite autorisée dans le formulaire HTML !");
break;
case 3: // UPLOAD_ERR_PARTIAL
echo "L'envoi du fichier a été interrompu pendant le transfert !";
break;
case 4: // UPLOAD_ERR_NO_FILE
echo "Le fichier que vous avez envoyé a une taille nulle !");
break;
}
}
else {
// $_FILES['nom_du_fichier']['error'] vaut 0 soit UPLOAD_ERR_OK
// ce qui signifie qu'il n'y a eu aucune erreur
}
?>
Grâce à la fonction move_uploaded_files() il est possible de transférer l'image du répertoire temporaire vers un répertoire de destination :
<?php
if ((isset($_FILES['nom_du_fichier']['fichier'])&&($_FILES['nom_du_fichier']['error'] == UPLOAD_ERR_OK))) {
$chemin_destination = '/var/www/fichiers/';
move_uploaded_file($_FILES['nom_du_fichier']['tmp_name'], $chemin_destination.$_FILES['nom_du_fichier']['name']);
}
?>
A lire aussi
Publié par
Jeff -
Dernière mise à jour le 1 juillet 2010 à 09:34 par Apatik
Vos remarques ont été prises en compte.
Merci pour vos retours.
Dans la mesure où $_FILES['nom_du_fichier']['error'] n'est pas un booléen, ça me gène de faire un if ($_FILES['nom_du_fichier']['error']) J'aurai plus vu quelque chose comme if ($_FILES['nom_du_fichier']['error'] != "UPLOAD_ERR_OK") Non? A vos avis les habitués!
$_FILES['nom_du_fichier']['fichier'] n'existe pas; il doit s'agir de $_FILES['nom_du_fichier']['tmp_name'].
Sinon, bravo pour cette explication.