Upload de fichiers en PHP
Pour télécharger des fichiers sur le serveur, il vous faut un formulaire munis d’un champ de type file. Vous devez rajouter l’attribut enctype ayant pour valeur : ‘multipart/form-data’, ce qui veut dire que votre formulaire va pouvoir transférer des données de type binaire.
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="20000">
<!-- Le champs 'hidden' doit être défini avant le champs 'file' -->
<label>Votre fichier</label> :
<input type="file" name="mon_fichier"><br>
<input type="submit" value="Envoyer">
</form>
Pour récupérer votre fichier, vous avez à votre disposition le tableau superglobal $_FILES qui aura plusieurs entrées :
- $_FILES[‘mon_fichier’][‘tmp_name’] : le nom temporaire du fichier sur le serveur
- $_FILES[‘mon_fichier’][‘name’] : le nom original du fichier sur la machine cliente
- $_FILES[‘mon_fichier’][‘type’] : le type MIME du fichier
- $_FILES[‘mon_fichier’][‘size’] : la` taille du fichier
Avant de vouloir sauvegarder le fichier téléchargé il faut vérifier son envoi.
Gestion des erreurs d’envoi
Vous pouver gerer les erreurs de chargement avec $_FILES[‘mon_fichier’][‘error’] :
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
}
Explication
* La première erreur ‘UPLOAD_ERR_INI_SIZE’ concerne la taille maximum autorisé par votre serveur, cette dépend donc de votre hébergement.
* La deuxième erreur ‘UPLOAD_ERR_FORM_SIZE’ concerne la valeur maximum autorisée par le formulaire, elle est définie par le champs de type hidden dont le name doit impérativement avoir pour valeur MAX_FILE_SIZE. La taille est définie par l’attribut ‘value’.
<input type="hidden" name="MAX_FILE_SIZE" value="20000">
Le champs caché doit être appelé avec le champs de type file.
Note : l’attribut value est exprimée en octets.
* La troisième erreur ‘UPLOAD_ERR_PARTIAL’ se produit si le transfert est interrompu et que le fichier est partiellement téléchargé.
* La dernière erreur ‘UPLOAD_ERR_NO_FILE’ concerne le transfert d’un fichier vide.
Dans le cas où le transfert n’échoue pas, vous pouvez envisager de sauvegarder le fichier.
Sauvegarder le fichier
Lors de l’envoi d’un fichier, son nom est mémoriser temporairement dans « $_FILES[‘mon_fichier’][‘tmp_name’] » et sera automatiquement détruit à la fin de l’exécution du script
La fonction move_uploaded_file() est utilisée pour le sauvegarder à un emplacement définitif
$nom = $_FILES['mon_fichier']['tmp_name'];
$nomdestination = './images/725.jpg';
move_uploaded_file($nom, $nomdestination);
La fonction accepte deux paramètres, le premier est le nom temporaire du fichier et le deuxième est son emplacement sur votre serveur. Dans cet exemple, le fichier est renommé ‘725.jpg’ et placé dans le répertoire ‘./image’.
Le code complet avec la gestion des erreurs serait donc ceci :
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{
$nom = $_FILES['mon_fichier']['tmp_name'];
$nomdestination = './images/725.jpg';
move_uploaded_file($nom, $nomdestination);
}
Si vous voulez ignorer la gestion des erreurs lors d’un transfert, vous pouvez utiliser la fonction is_uploaded_file() qui indique si le fichier a été téléchargé par HTTP POST.
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
$nom = $_FILES['mon_fichier']['tmp_name'];
$nomdestination = './images/725.jpg';
move_uploaded_file($nom, $nomdestination);
} else {
echo "Attaque possible par téléchargement de fichier : ";
echo "Nom du fichier : '". $_FILES['userfile']['tmp_name'] . "'.";
}
Cette méthode ne fournit cependant aucune information sur le type d’erreur.