$_FILES[ ]

FondamentalMé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 :

1
<form action='' method='post' enctype='multipart/form-data'>
2
<div>
3
  <label>fichier</label>
4
  <input type='file' name='fichier'/>
5
</div>
6
<div>
7
  <label>Enregistrer</label>
8
  <input type='submit' value='cliquez pour enregistrer' />
9
</div>
10
</form>

Ce formulaire contient le champ fichier qui sera transmis au serveur.

MéthodeRécupérer

Pour récupérer le fichier, on utilise le tableau associatif $_FILES[ ] .

Dans notre exemple :

1
echo $_FILES['fichier']['name'] /* nom du fichier */
2
echo $_FILES['fichier']['type'] /* type du fichier */
3
echo $_FILES['fichier']['size'] /* taille en octets */
4
echo $_FILES['fichier']['tmp_name'] /* emplacement du fichier temporaire sur le serveur */
5
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.

1
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2
  echo $_FILES['fichier']['name'] /* nom du fichier */
3
  echo $_FILES['fichier']['type'] /* type du fichier */
4
  echo $_FILES['fichier']['size'] /* taille en octets */
5
  echo $_FILES['fichier']['tmp_name'] /* emplacement du fichier temporaire sur le serveur */
6
  echo $_FILES['fichier']['error'] /* code erreur du téléchargement */
7
}

MéthodeDé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.

1
$origine = $_FILES['fichier']['tmp_name'];
2
$destination = 'fichiers/'.$_FILES['fichier']['name'];
3
move_uploaded_file($origine,$destination);

ConseilChargement

Pour être sûr que le fichier a bien été transmis et chargé, on peut écrire :

1
if (isset($_FILES['fichier']) && is_uploaded_file($_FILES['fichier']['tmp_name']))
2
{
3
$origine = $_FILES['fichier']['tmp_name'];
4
$destination = 'fichiers/'.$_FILES['fichier']['name'];
5
move_uploaded_file($origine,$destination);
6
}

AttentionSé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

1
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

1
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éthodeRenommer 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.

1
$nom = "mon nom";
2
if (isset($_FILES['fichier']) && is_uploaded_file($_FILES['fichier']['tmp_name']))
3
{
4
	$fichier = str_replace(' ', '', $nom) . "." . strtolower(pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION));
5
	$origine = $_FILES['fichier']['tmp_name'];
6
	$destination = "fichiers/$fichier";
7
8
	move_uploaded_file($origine,$destination);
9
}

N'oubliez pas le point entre le nom du fichier et l'extension.