Le file upload - Configuration de PHP 1 Introduction 2 Le formulaire

Transcription

Le file upload - Configuration de PHP 1 Introduction 2 Le formulaire
UNIVERSITE DE CAEN
U.F.R de Sciences
Licence Informatique
Module Technologies Internet
Le file upload - Configuration de PHP
[email protected]
1
Introduction
File upload :
– Envoi d’un fichier local vers un serveur.
– Utilisation d’une interface Web.
– Utilisé par exemple pour gérer un site via un navigateur ou par un webmail pour envoyer un fichier
attaché.
2
Le formulaire HTML
On utilise un formulaire réalisé en XHTML, de façon tout à fait classique. Quelques détails auxquels il
faut faire attention pour que ça marche :
– le file upload ne peut se faire qu’avec la méthode post.
– spécifier dans la balise form le type de codage utilisé pour l’envoi des données au serveur avec
l’attribut enctype="multipart/form-data". Sans cette information le file upload ne pourra pas
s’effectuer.
– Pour avoir le contrôle du formulaire avec le bouton Browse... ou Parcourir..., il faut un élément
input dans le formulaire :
– <input name="fichier" type="file" /> pour avoir le bouton Parcourir...
Exemple 1 (Exemple de formulaire)
<form enctype="multipart/form-data"
action="traitement.php"
method="post" >
<input type="file" name="fichier" value="" />
<input type="submit" name="Envoi" value="valider" />
</form>
Remarque 1 (Sécurité)
La taille maximum de fichier accepté est spécifiée dans la configuration du serveur (voir paragraphe 5).
3
Variables PHP associées
Le script PHP effectuant le traitement va récupérer les informations concernant le fichier uploadé dans
le tableau $_FILES. Le principe est le même que pour les tableaux $_POST et $_GET : il s’agit d’un tableau associatif où les clés correspondent à la valeur de l’attribut name des champs input de type file.
La différence est que $_FILES[’fichier’] (en supposant qu’on ait name="fichier" dans le input du
formulaire) est lui-même un tableau associatif avec les clés suivantes :
– $_FILES[’fichier’][’name’] : le nom du fichier sur la machine client.
– $_FILES[’fichier’][’tmp_name’] : l’emplacement (chemin complet) où le fichier uploadé est placé
temporairement (dans le répetoire /tmp par défaut). Dans le cas où aucun fichier n’a été uploadé,
cette variable contient none.
– $_FILES[’fichier’][’size’] : la taille en octets du fichier envoyé.
– $_FILES[’fichier’][’type’] : le type MIME du fichier (si le navigateur l’a transmis).
– $_FILES[’fichier’][’error’] : le code d’erreur associé au file upload effectué (PHP > 4.2.0).
Le code d’erreur contenu dans $_FILES[’fichier’][’error’] peut avoir les valeurs suivantes :
– UPLOAD_ERR_OK, valeur 0 : succès du file upload
– UPLOAD_ERR_INI_SIZE, valeur 1 : taille du fichier supérieure à la valeur de la directive upload_max_filesize
du fichier php.ini
1
– UPLOAD_ERR_FORM_SIZE, valeur 2 : taille du fichier supérieure à la valeur spécifiée par MAX_FILE_SIZE
dans le formulaire HTML (pas fiable)
– UPLOAD_ERR_PARTIAL, valeur 3 : fichier partiellement uploadé
– UPLOAD_ERR_NO_FILE, valeur 4 : aucun fichier uploadé
– UPLOAD_ERR_NO_TMP_DIR, valeur 6 : pas de répertoire temporaire
– UPLOAD_ERR_CANT_WRITE, valeur 7 : impossible d’écrire sur le disque dur (PHP ¿5)
– UPLOAD_ERR_EXTENSION, valeur 8 : (PHP ¿5.2) pas clair, je n’ai pas l’explication de façon sûre (au
01/01/10)
Le code d’erreur associé à un file upload permet de gérer les différents cas d’erreur simplement à l’aide
d’une instruction switch.
4
Traitement du fichier uploadé
Le fichier uploadé est placé par le serveur dans un répertoire temporaire (spécifié dans la configuration
de PHP, /tmp par défaut) sous un nom quelconque (/tmp/php7Mhh3j par exemple). Il faut donc déplacer
le fichier uploadé vers le répertoire où l’on désire le conserver, et le renommer de façon systématique.
Pour cela on va utiliser la fonction move_uploaded_file (avec PHP version 4.0.3 ou plus) plutôt que
la fonction copy, la fonction move_uploaded_file vérifiant que le fichier à déplacer est bien un fichier qui
a été envoyé par file upload, ce qui accroit la sécurité.
Syntaxe :
booléen move_uploaded_file (string filename, string destination)
La fonction move_uploaded_file renvoie TRUE en cas de succès et FALSE en cas d’échec (soit le fichier
n’est pas un fichier uploadé valide, soit c’est un fichier uploadé valide et le serveur n’a pas réussi à le
déplacer).
Il faut utiliser le chemin complet du répertoire de destination.
Remarque 2
La fonction is_uploaded_file(string filename) renvoie TRUE si le fichier uploadé est valide et FALSE
sinon. Si la fonction move_uploaded_file n’est pas disponible, on peut l’utiliser pour vérifier qu’on a bien
un fichier uploadé avant de le manipuler.
Exemple 2 (Déplacer un fichier uploadé)
$repertoire = "/users/ens/jml/toto/";
$nomFichier = "fichier.upload";
$nomComplet = $repertoire . $nomFichier;
if (! move_uploaded_file($_FILES[’fichier’][’tmp_name’], $nomComplet)) {
// Problème lors de la copie du fichier
echo "Problème de copie de fichier";
}
else {
// Copie réussie
echo "Copie de fichier réussie";
}
Important :
Pour réussir la copie du fichier, le serveur doit avoir le droit d’écrire dans le répertoire de destination.
Cela peut poser un problème de sécurité dans le cas d’hébergement mutualisé. Dans ce cas beaucoup
d’hébergeurs utilise le mécanisme du SAFE MODE qui limite ces possibilités (mais qui doit disparaı̂tre
avec PHP6).
2
5
Configuration de PHP
La configuration de PHP est consignée dans le fichier php.ini qui est lu à chaque démarrage du serveur
web. Il y a un fichier php.ini pour chaque version de PHP installée (/etc/php5/apache2/php.ini et
/etc/php5/cli/php.ini sur ma machine).
On peut afficher dans un navigateur la configuration du serveur avec la fonction phpinfo().
Exemple 3 (Configuration de PHP en module Apache : fichier info.php)
<?php
phpinfo();
?>
Les points qu’il faut vérifier dans le fichier de configuration pour le file upload :
– file_uploads vaut 0 ou 1.
– max_execution_time temps maximum d’exécution pour un script.
– memory_limit mémoire maximum allouée à un script.
– post_max_size taille maximum des données transmises par un formulaire.
– upload_max_filesize taille maximum pour un file upload.
– upload_tmp_dir répertoire où sont placés les fichiers envoyés (/tmp par défaut).
Remarque 3
Attention : il faut absolument que la valeur de l’option post_max_size soit supérieure à la valeur de
l’option upload_max_filesize puisque les données uploadées le sont dans un formulaite POST.
Remarque 4
Attention PIÈGE : si le total de vos données POST est supérieure à la limite post_max_size
alors rien n’est transmis au serveur : les tableaux $_POST et $_FILES sont vides. Faire un test sur
$_FILES[’fichier’][’error’] ne donne alors rien.
3