DevKB
Web Development Knowledge Base
HOME | TOP 20 | WRITE AN ARTICLE |
Sections :



RSS RSS Feed

You too, please publish your useful code snippets in any programming language :
write an article !


Valid HTML 4.0 Transitional

Plateforme d'envoi de gros fichiers en ligne
Dépannage site web
Blog infogérance
Hébergement e-mail

Aurélie Dufour - - 20/03/2008 - vue 8913 fois

Upload de fichiers sécurisé en PHP

Cette fonction php permet l'envoi de fichiers via un formulaire HTML classique ; elle effectue plusieurs tests sur le fichier sélectionné avant de l'envoyer (extension du fichier, taille maximale autorisée, caractères spéciaux...).

UPDATE : Il existe un service gratuit nommé Simple File Upload qui vient se greffer sur un script PHP existant et permet l'upload de fichiers lourds en contournant les limitations de son hébergeur.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Upload sécurisé de fichiers en PHP</title>
<style type="text/css">
body{
	font-family: Arial, Helvetica, sans-serif;
	font-size: 10pt;
	}
</style>
</head>

<body>
<form method="post" action="index.php" enctype="multipart/form-data">
      <input name="fichier" type="file"><br /><br />
	  <input type="submit" name="envoyer" value="Envoyer">
      <br /><br />
	  <i>Vous pouvez joindre un fichier au format DOC, RTF, PDF, ou TXT.</i>
	</fieldset>
</form>

<?php
	//si clic sur le bouton "envoyer"...
	if(isset($_POST['envoyer']))
	{	
		//on fait une série de tests sur le fichier : si une erreur est levée, on l'affiche puis on sort du programme 
		
		//test si un fichier a bien été transmis (si le champ d'envoi de fichier n'a pas été laissé vide)
		if($_FILES['fichier']['size']<=0)
		{
			$alerte = 'Aucun fichier n\'a été sélectionné !\n';
			echo "<script type=\"text/javascript\">alert(\"$alerte\");</script>";
			exit;
		}
									
		//interception des erreurs qui peuvent arriver
		if($_FILES['fichier']['error']>0)
		{
			 $alerte = 'Erreur lors du transfert du fichier...\n';
			 echo "<script type=\"text/javascript\">alert(\"$alerte\");</script>";
			 exit;
		}
									
		//le fichier ne doit pas excéder 1 Mo
		if($_FILES['fichier']['size']>1024000)
		{
			$alerte = 'Votre fichier dépasse la limite autorisée (1 Mo) !\n';
			echo "<script type=\"text/javascript\">alert(\"$alerte\");</script>";
			exit;
		}
					
		//tableau avec les extensions autorisées pour le fichier			
		$ext_allow = array('doc','pdf','rtf','txt');
									
		//on récupère l'extension du fichier envoyé par le formulaire
		$ext_file = strtolower(substr(strrchr($_FILES['fichier']['name'],'.'),1));
									
		//on vérifie que l'extension du fichier envoyé est bien autorisée
		//c'est-à-dire qu'on la retrouve dans le tableau $ext_allow
		//sinon on affiche un message d'alerte
		if(!in_array($ext_file,$ext_allow) && $_FILES['fichier']['size'] > 0){
			$alerte = 'Votre fichier n\'est pas autorisé (pas au format DOC, PDF, RTF ou TXT) !\n';
			echo "<script type=\"text/javascript\">alert(\"$alerte\");</script>";
		}	
		//à ce stade tout est bon : on transfère le fichier vers le serveur, dans le bon répertoire
		else {
				//on remplace les caractères spéciaux du nom du fichier par des caractères standards
				$search = array ('@[ËÊÈÉéèëê]@i','@[ÄÂÀÁäâàá]@i','@[ÏÎÌÍïîìí]@i','@[ÜÛÙÚüûùúµ]@i','@[ÖÔÒÓöôòó]@i','@[ç]@i','@[ñ]@i','@[ \'"]@i');
				$replace = array ('e','a','i','u','o','c','n','_');
				$_FILES['fichier']['name'] = preg_replace($search, $replace, $_FILES['fichier']['name']);
			
				//le répertoire vers lequel on souhaite transférer le fichier :
				//si le dossier n'existe pas, on le crée :
				$rep = 'monDossier/';
				if(!is_dir($rep))mkdir($rep);
		
				//on teste si le fichier n'existe pas déjà dans notre dossier :
				if(file_exists($rep.$_FILES['fichier']['name']))
				{
					//s'il existe déjà, on affiche une alerte JS
					echo "<script type=\"text/javascript\">alert(\"Le nom : ".$_FILES['fichier']['name']." a déjà été choisi par quelqu'un d'autre !\\n Veuillez en trouver un autre svp...\");</script>";	
				}
			
				//sinon tout est OK et on peut enfin enregistrer le document sur le serveur
				else{			
						if((in_array($ext_file,$ext_allow))&&($_FILES['fichier']['size'] > 0)&&(move_uploaded_file($_FILES['fichier']['tmp_name'],$rep.$_FILES['fichier']['name'])))
						{
							//message de confirmation JS, comme quoi le fichier est bien enregistré sur le serveur
							echo "<script type=\"text/javascript\">alert(\"Votre fichier a bien été enregistré !\");</script>";	
						}
						//sinon, il y a un problème lors de l'envoi (vitesse de connexion trop lente par exemple), donc on affiche un message d'erreur
						else echo "<script type=\"text/javascript\">alert(\"Une erreur s'est produite lors du transfert de votre fichier...\");</script>";
					}
			}
	}
?>
</body>
</html>


Xarnax - 05/07/2008
Pour les professionnels, il existe des solutions d'upload de gros fichiers permettant d'avoir sa propre plateforme de stockage personnalisée.


Write a comment :
Your name :     E-mail (optional) :

AntiSpam : what animal is visible on this picture ? :

Nos partenaires : iPhone 8 Cases & Protection