$_FILES[ ]
Fondamental : Méthode POST
En html, on peut transmettre des fichiers par la méthode POST.
Cet envoi se fait par l'intermédiaire des formulaires auxquels on ajoute l'attribut enctype :
<form action='' method='post' enctype='multipart/form-data'>
<div>
<label>fichier</label>
<input type='file' name='fichier'/>
</div>
<div>
<label>Enregistrer</label>
<input type='submit' value='cliquez pour enregistrer' />
</div>
</form>
Ce formulaire contient le champ fichier qui sera transmis au serveur.
Méthode : Récupérer
Pour récupérer le fichier, on utilise le tableau associatif $_FILES[ ] .
Dans notre exemple :
echo $_FILES['fichier']['name'] /* nom du fichier */
echo $_FILES['fichier']['type'] /* type du fichier */
echo $_FILES['fichier']['size'] /* taille en octets */
echo $_FILES['fichier']['tmp_name'] /* emplacement du fichier temporaire sur le serveur */
echo $_FILES['fichier']['error'] /* code erreur du téléchargement */
Dans notre cas, l'attribut action est vide. C'est la page elle-même qui contient le traitement. Nous devons utiliser la super-globale $_SERVER.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
echo $_FILES['fichier']['name'] /* nom du fichier */
echo $_FILES['fichier']['type'] /* type du fichier */
echo $_FILES['fichier']['size'] /* taille en octets */
echo $_FILES['fichier']['tmp_name'] /* emplacement du fichier temporaire sur le serveur */
echo $_FILES['fichier']['error'] /* code erreur du téléchargement */
}
Méthode : Déplacer le fichier dans un dossier
Pour l'instant le fichier se trouve dans les temporaires du serveur.
Il faut maintenant le déplacer dans un dossier de notre site.
L'URL de destination est relative à la page active.
$origine = $_FILES['fichier']['tmp_name'];
$destination = 'fichiers/'.$_FILES['fichier']['name'];
move_uploaded_file($origine,$destination);
Conseil : Chargement
Pour être sûr que le fichier a bien été transmis et chargé, on peut écrire :
if (isset($_FILES['fichier']) && is_uploaded_file($_FILES['fichier']['tmp_name']))
{
$origine = $_FILES['fichier']['tmp_name'];
$destination = 'fichiers/'.$_FILES['fichier']['name'];
move_uploaded_file($origine,$destination);
}
Attention : Sécurité
Les fichiers que vous recevez peuvent être une source de failles de sécurités.
Par exemple :
si l'extension est php
si le fichier contient du php
Pour y remédier :
On peut vérifier l'extension
if(!preg_match('/\.(jpg|gif|png)$/',$_FILES['fichier']['name'])) unset($_FILES['fichier']) ;
Dans notre exemple, si le fichier n'a pas l'extension jpg, gif ou png la variable $fichier est détruite.
On peut supprimer le terme php du nom du fichier
preg_replace('/php/','',$_FILES['fichier']['name']);
On peut empêcher l'interprétation des fichiers
En écrivant php_flag engine off dans le fichier .htaccess du dossier contenant les fichiers.
Méthode : Renommer le fichier
Afin de ne pas être dépendant du nom de fichier du client, on peut le renommer.
Ce nom peut dépendre de l'identifiant de l'utilisateur, de son login, de son alias...
Ici nous supposons que le nom de l'utilisateur est mon nom il faudra supprimer les espaces et récupérer l'extension du fichier.
$nom = "mon nom";
if (isset($_FILES['fichier']) && is_uploaded_file($_FILES['fichier']['tmp_name']))
{
$fichier = str_replace(' ', '', $nom) . "." . strtolower(pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION));
$origine = $_FILES['fichier']['tmp_name'];
$destination = "fichiers/$fichier";
move_uploaded_file($origine,$destination);
}
N'oubliez pas le point entre le nom du fichier et l'extension.