Un projet ENSISA
4 juin
Voici le premier tutorial pour utilisateurs avancés : l’upload d’images (ou envoi d’images).
Ce tutorial est un peu plus complexe que les autres publiés jusqu’à maintenant car il fait appel à une multitude de fonctions que nous tenterons d’éclaircir pour vous. Ce script sera composé de deux fichiers utiles à la gestion d’erreur. Au finale le script sera capable de : reconnaître que le fichier est une image, limiter la taille de l’image, afficher un texte d’upload raté/réussi ainsi que l’image uploadée et le lien static de celle-ci pour l’intégrer à d’autres sites par exemple.
Débutons par le formulaire :
Le formulaire d’envoi doit spécifier en action : action=”Envoi_images.php”. Ceci est nécessaire pour spécifier au formulaire que Envoi_images.php sera le fichier qui traitera la commande. Ensuite, nous entrons la taille maximale du fichier. Son type est à « hidden », cela signifie qu’il est invisible à l’utilisateur mais pas pour le serveur. Le reste est du HTML standard.
<form enctype="multipart/form-data" action="Envoi_images.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="5000000"> <input type="file" name="img" size="50"> <p><input type="submit" name="envoi" value="Envoyer l'image"> </form>
Comme tout script PHP avec formulaire, il faut tester si le bouton « envoyer » a bien été cliqué
if(!isset($_POST['envoi']))
Si envoi a été cliqué, il faut inclure le fichier secondaire pour afficher le formulaire !
include("formulaire_envoi.inc");
Il paraît évident que si le fichier est trop grand, que ce n’est pas une image, ou qu’il y a eu une erreur quelconque, l’utilisateur doit en être informé
if($_FILES['img']['tmp_name'] == "none")
{
echo "<b>Il y a eu un problème. Soit votre fichier n'est pas une image, soit il dépasse les 5Mo.<br>";
include("formulaire_envoi.inc");
exit();
}
if(!ereg("image",$_FILES['img']['type']))
{
echo "<b>Le fichier n'est pas une image!</b><br>";
include("formulaire_envoi.inc");
exit();
}
Dans le code ci-dessus,$_FILES[’img’][’tmp_name’] == “none” teste si le fichier temporaire créé lors de l’upload est disponible. S’il ne l’est pas, une erreur est survenue! On informe l’utilisateur. Ensuite, le test suivant !ereg(”image”,$_FILES[’img’][’type’]) va essayer de voir si le fichier est une image. «int ereg ( string $pattern, string $string [,array &$regs]): recherche dans la chaîne string les séquences de caractères qui correspondent au masque pattern, en tenant compte de la casse ». (PHP.net)
Quand tous les tests ont réussis :
Il faut dorénavant specifier la destination d’enregistrement de l’image : ici nous la mettrons à la racine du dossier dans lequel se trouve le script. Il est également de rigueur de définir un fichier temporaire lors de l’upload.
$destination = $_FILES['img']['name']; $fichier_temporaire = $_FILES['img']['tmp_name'];
« move_uploaded_file ( string $filename , string $destination ) s’assure que le fichier filename est un fichier téléchargé par HTTP POST. Si le fichier est valide, il est déplacé jusqu’à destination. Ce type de vérification est spécialement important s’il est possible que les fichiers téléchargés révèlent leur contenu à l’utilisateur, ou même aux utilisateurs du même système ». (PHP.net)
move_uploaded_file($fichier_temporaire,$destination);
Enfin, les quelques lignes supplémentaires sont uniquement pour la commodité de l’utilisateur : confirmation de l’envoi avec taille de fichier, affichage de l’image envoyée, affichage du lien statique de l’image (attention, ici l’image es stockée dans ../fich/upload/image.jpg, ce qui peut différer sur votre serveur!)
echo "<p><b>L'image a bien été envoyée: </b>{$_FILES['img']['name']} ({$_FILES['img']['size']} octets)</p>";
echo "<img src=".$destination." width='400' />";
echo "<p>Le lien de l'image est: http://".$_SERVER["SERVER_NAME"]."/fich/upload/".$destination;
echo "<p> <a href='Envoi_images.php'>retour</a>";
26 mai
Pour le compteur de visites il est important de connaître les fonctions suivantes : fopen(), fclose(), flock(), fwrite() dont on peut observer les fonctionnalités sur PHP.net.
Sachant que le nombre de visites est enregistré dans un fichier texte, le but du tutorial sera de lire le fichier correspondant et d’y incrémenter les visites :
Tout d’abord, il faut tester si le fichier existe ou non
if(file_exists("compteur.txt"))
s’il existe, l’ouvrir en lecture (r)
if($id_file=fopen("compteur.txt","r"))
« flock() permet de réaliser un système simple de verrous écriture/lecture, qui peut être utilisé sur n’importe quelle plate-forme (Unix et Windows compris). Le verrou est également levé avec la fonction fclose() (qui est également automatiquement appelée lors de la fin du script).
PHP dispose d’un système complet de verrouillage de fichiers. Tous les programmes qui accèdent au fichier doivent utiliser la même méthode de verrouillage pour qu’il soit efficace » (PHP.net)
flock($id_file,1);
« fread() retourne la chaîne lue, ou FALSE si une erreur survient » (PHP.net) 10 = nombre d’octets lus
Il faut incrémenter le compteur à chaque fois que la fonction est appelée.
$nb=fread($id_file,10); $nb++;
fclose() ferme le fichier entré en paramètres.
fclose($id_file);
« fopen() crée une ressource nommée, spécifiée par le paramètre filename("compteur.txt"), sous la forme d’un flux. W = ouverture en écriture » (PHP.net)
$id_file=fopen("compteur.txt","w");
«fwrite() écrit le contenu de la chaîne $nb dans le fichier pointé $id_file » (PHP.net)
fwrite($id_file,$nb);
Verrou lecture/écriture et fermeture du fichier.
flock($id_file,3); fclose($id_file);
Si le fichier n’existe pas, afficher cette phrase.
echo " fichier introuvable";
Si le fichier n’existe pas, il faut en créer un nouveau qui commence à 1.
$nb = 1;
$id_file=fopen("compteur.txt","w");
fwrite($id_file,$nb);
fclose($id_file);
Affichage du résultat
echo "<table><tr><td>Voici déjà </td><td>$nb</td><td>visites sur le site</td></tr></table>";
Au final, il faut mettre tout cela en forme. Le principe est simple, voir la source ci-dessous :
télécharger compteur_visites.php (262)
Au final, ce script donnera cela :
| Voici déjà | 12073 | visites sur le site |