Un exemple complet :
<?php
header('Content-type: text/html; charset=UTF-8');
// Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ; si fichier1.ext existe, renomme en fichier2.ext etc..
function Rename_fich($dossier,$fichier)
{
//Si le fichier existe et est un fichier valide
if (is_file($dossier.$fichier))
{
// Informations sur le fichier
$info = pathinfo($dossier.$fichier);
$extension = $info['extension'];
$filename = $info['filename'];
// Cherche dans le nom de fichier des caractères numériques en fin de nom
$num = preg_match('#[0-9]+$#',$filename,$matches)? $matches[0] : null;
// Si des caractères numériques sont trouvés, incrémente la valeur de +1 sinon concatène 1 au nom du fichier
$filename = isset($num)? substr($filename,0,- strlen($matches[0])).($matches[0]+1) :$filename.'1';
// Reconstruction du nom de fichier avec son extension (si elle existe)
$fichier = !empty($extension) ? $filename.'.'.$extension : $filename;
// Appel de la fonction pour re vérification avec le nouveau nom du fichier
return Rename_fich($dossier,$fichier);
}
// Retourne le chemin complet (adresse répertoire + nom de fichier)
else return $dossier.$fichier;
}
$message = null;
// Téléchargement du fichier vers le serveur
if (!empty($_POST['chargement']) && isset($_FILES['userfile']['tmp_name'],$_FILES['userfile']['name']))
{
// Nom du fichier téléchargé
$localfile = $_FILES['userfile']['name'];
// Extensions de fichier autorisées
$extensions_ok = array('png','jpg','jpeg','gif','pdf','txt');
// Trouve l'extension du fichier et la met en minuscules
$extension = strtolower(substr($localfile,strrpos($localfile, ".")+1));
// Si l'extension est contenue dans le tableau des extensions autorisées, on continue le script
if (in_array($extension,$extensions_ok))
{
// Nettoyage des caractères accentués ou non valides
$nom_fichier = iconv('UTF-8', 'ASCII//TRANSLIT', $localfile);
$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
// Adresse du serveur
$adresse = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
// Répertoire de destination
$repertoire = 'PHOTO/';
// Adresse du répertoire de destination
$destination = $adresse.$repertoire;
// Vérification de l'existence du fichier dans le répertoire et si besoin renommage du fichier
$destination = Rename_fich($destination,$nom_fichier);
// Nom du fichier final
$nom_fichier = basename($destination);
// Chargement du fichier - avec le nom temporaire créé par le serveur - vers l'adresse de destination
if(@move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))
{
// Préparation des messages de confirmation
$resultat1 = 'Le fichier "'.$localfile.'" a été téléchargé sur le serveur';
$resultat2 = 'Le fichier "'.$localfile.'" renommé "'.$nom_fichier.'" a été téléchargé sur le serveur';
// Création du message de confirmation
$message = $localfile == $nom_fichier ? $resultat1 : $resultat2;
}
else
{
// Message d'erreur de téléchargement
$message = 'Problème de téléchargement';
}
}
else
{
//Transforme le tableau en chaine de caractères séparés par une virgule suivie d'un espace (pour affichage dans le message d'erreur)
$extensions_autorisees = implode(', ',$extensions_ok);
// Message d'erreur d'extension du fichier
$message = 'Extension du fichier non autorisée. Extensions autorisées : '.$extensions_autorisees.'.';
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Exemple téléchargement avec renommage des fichiers si déjà existants</title>
</head>
<body>
<div><?php if (isset($message)) echo $message;?></div>
<form enctype="multipart/form-data" action="#" method="post">
<p>
<input type="hidden" name="chargement" value="1" />
<input name="userfile" type="file" size="70" />
<input type="submit" value="Envoyez" style="margin-left:5px" />
</p>
</form>
<p>Taille maximum autorisée = <?php echo ini_get('upload_max_filesize').'o'?></p>
</body>
</html>
En phase de développement, vous pouvez supprimer le '@' devant "move_uploaded_file" pour afficher plus d'information concernant les erreurs. Il est prudent de le remettre en phase d'exploitation.