PHP Upload fichier

Définition

L'utilisation des formulaires peut être étendue pour proposer aux visiteurs d'envoyer un fichier ou une image : c'est ce qu'on appelle le téléchargement de fichier (file upload). Le PHP propose des fonctions qui permettent de récupérer les fichiers postés par le visiteur et les enregistrer sur le serveur.

Fonctionnement

Au travers d'un formulaire, le visiteur sélectionne depuis son ordinateur le fichier à uploader. Ensuite, il clique sur le bouton "envoyer" pour soumettre le formulaire à la page désignée par action="xxx.php" de la balise <form>

Le PHP s'occupe des données envoyées par le formulaire :

 

Concernant le fichier uploadé : le PHP va gérer le fichier. Le fichier est préalablement stocké dans un dossier temporaire. Si on souhaite le garder, il faut le placer ailleurs (dans un dossier du site par exemple). Si au contraire on décide de ne pas garder le fichier (par exemple si on remarque qu'il est trop grand, que ce n'est pas une image, …) il suffit de ne pas le déplacer ; il sera effacé automatiquement lorsque le script PHP aura fini d'être exécuté.

1er fichier : formulaire permettant l'upload du fichier

<!DOCTYPE html>

<html>

	<head>
		<title>Exemple</title>
		<meta charset="UTF-8" />
	</head>

<body>

<h1>Exemple pour transferer une photo</h1>

<?php

	<form method="post" action="page.php" enctype="multipart/form-data">
		Envoyer un photo (max: 1Mo) : 
		<input type="file" name="photo" />
		<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
		<br/>
		<input type="submit" name="submit" value="Envoyer" />
	</form>

?>

</body>

</html>
		

Remarque :

2ème fichier (ici page.php) : récupération du fichier uploadé par le serveur

Après avoir validé le formulaire, les fichiers sont alors uploadés et placés dans un répertoire temporaire. L'avantage, c'est que seul le script PHP pourra accéder à ce dossier.

Nous allons donc contrôler le fichier puis le déplacer vers un dossier du site. On peut contrôler plusieurs choses : la taille, le type, le nom, les dimensions (si c'est une image)

Le tableau $_FILES contient certaines informations sur les fichiers. Pour chaque champ de type file, on peut obtenir les informations le concernant dans le tableau $_FILES[attribut_name]. On retrouve actuellement les informations suivantes :

 
<?php

$_FILES['photo']['name']     	// contient le nom original du fichier,

$_FILES['photo']['type']     	// contient le type du fichier.

$_FILES['photo']['size']     	// contient la taille du fichier en octets.

$_FILES['photo']['tmp_name'] 	// contient le répertoire temporaire.

$_FILES['photo']['error']		// contient le code d'erreur qui permet de savoir
								//  si le fichier a bien été uploadé.
?>

 

Contrôles à effectuer sur le fichier uploadé :

<?php

// **********************************************************
// vérification pour savoir si le fichier a bien été uploadé
// **********************************************************

if ($_FILES['photo']['error'] > 0) 
	{
		$erreur = "Erreur lors du transfert";
	}


// **********************************************************
// vérification de la taille
// **********************************************************

$maxsize = $_POST["MAX_FILE_SIZE"] ;

if ($_FILES['photo']['size'] > $maxsize) 
	{
		$erreur = "Le fichier est trop gros";
	}


// **********************************************************
// vérification du type : utiliser les fonctions suivantes :
//
// la fonction strrchr renvoie l'extension avec le point (« . »)
// la fonction substr(chaine,1) ignore le premier caractère de chaine
// la fonction strtolower met l'extension en minuscules.
// **********************************************************

$extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png' );

$extension_upload = strtolower(substr(strrchr($_FILES['photo']['name'],'.'),1));

if (in_array($extension_upload,$extensions_valides) ) 
	{
		echo "Extension correcte";
	}

?>
		

Déplacer le fichier uploadé :

Pour déplacer le fichier, deux informations sont nécessaires :

IMPORTANT (règles fondamentales) : deux fichiers ne peuvent pas avoir le même nom dans le même dossier et il faut faire attention à l'extension. Ce qui veut dire que l'on ne va presque jamais garder le nom de départ du fichier, car deux visiteurs différents pourraient avoir un fichier du même nom.

<?php

// **********************************************************
// Une fois le nom du fichier choisi, 
// il faut déplacer le fichier du répertoire temporaire 
// vers le dossier de destination. 
// **********************************************************


$id = md5(uniqid(rand(), true));  //Créer un identifiant unique

$nom = "images/" . $id . "." . $extension_upload ;   // ce nom doit être unique !!!!

$resultat = move_uploaded_file($_FILES['photo']['tmp_name'],$nom);

if ($resultat) 
	{
		echo "Transfert réussi";
	}

?>