Une fois le fichier uploadé et déplacé dans un dossier du site, il est possible d'effectuer plusieurs actions. Parmi les nombreuses possibilités qui s’offrent à nous, voici les quelques-unes que nous allons étudier :
- enregistrement des infos dans une BDD ;
- téléchargements avec compteur ;
- création de miniatures.
Enregistrement des infos dans une BDD
Je ne vais pas vous apprendre à créer une table ou à insérer un nouvel enregistrement. En revanche, je peux vous donner quelques conseils pour bien utiliser votre BDD.
Tout d'abord, notons quelles informations sont utiles à enregistrer : le titre, la description, le nom du fichier, son nom dans le dossier du site, la date d'ajout, la taille, et, si vous avez un espace membre, pourquoi ne pas y ajouter l'id du membre qui a posté le fichier ?
Le nombre de champs, et ceux que vous choisissez, dépend fortement de l'utilisation que vous souhaitez faire de ces fichiers. S'il s'agit juste d'un avatar, il est certainement inutile d'enregistrer des infos dans une BDD, il suffit de donner comme nom à l'image l'id du membre et vous éviterez ainsi une requête inutile.

S'il s'agit au contraire d'une galerie, il est très pratique d'enregistrer les infos dans une table en y ajoutant par exemple une note attribuée par les visiteurs. Réfléchissez toujours à ce dont vous aurez besoin par la suite.
Voici, par exemple, la table que je pourrais créer pour un mini-espace membre permettant d'uploader des fichiers :
Citation : Table MySQL
Il peut s'avérer très utile, pour une question de clarté et de facilité, d'utiliser un préfixe sur les noms des champs. Vous pouvez voir que dans ma table, tous les champs commencent par le préfixe up_, qui permet d'identifier immédiatement la provenance de l'information. Pensez à utiliser systématiquement un préfixe différent pour chaque table, d'environs 2-3 caractères suivis d'un underscore (_).
La raison pour laquelle j'ai mis un champ
filesize est simple : pour éviter de devoir aller chercher la taille pour chaque fichier, on l'enregistre dans la BDD, ce qui permet d'économiser un temps de traitement intéressant. Le champ d'identification est quant à lui toujours très utile : en mode
auto_increment, il vous permettra de directement pouvoir accéder aux infos d'un fichier particulier.
Enfin, n'oubliez pas d'optimiser vos tables en utilisant les types corrects :
- un nombre est de type TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE ou DECIMAL selon sa précision, et n'oubliez pas d'indiquer sa taille selon vos besoins ;
- un texte est de type VARCHAR (moins de 256 caractères) ou TEXT (plus de 256 caractères) ;
- une date est de type DATE pour uniquement la date, TIME pour uniquement l'heure, ou DATETIME pour les deux réunis ;
- un booléen (VRAI/FAUX) n'a pas de type particulier. On utilise un TINYINT de taille 1 positionné à 0 ou 1 (pas ENUM!) ;
- une suite binaire est de type BLOB ou BINARY.
Téléchargements avec compteur
Le principe est assez simple : on veut permettre aux visiteurs de télécharger un fichier tout en comptant le nombre de téléchargements de celui-ci. Il nous faut bien sûr utiliser la table que vous aurez créée en y ajoutant un champ permettant de mémoriser le nombre de downloads. Il s'agit donc d'un champ de type INT(5), appelé par exemple
up_counter.
Imaginons qu'une page référence les différents fichiers (ce que vous savez faire, puisqu'il suffit de lister le contenu de la table

) avec des liens pour télécharger les fichiers. Ces liens indiquent le numéro d'identification du fichier, par exemple :
Code : Console | download.php?file=25
download.php?file=143
download.php?file=476 |
La première chose à faire, c'est de récupérer quelques informations dans la table pour pouvoir les envoyer au visiteur. C'est une simple requête de sélection :
Code : SQL | SELECT up_filename, up_filesize, up_final FROM upfiles WHERE up_id = …
|
Bien sûr, les « … » doivent être remplacés par l'id donné par le lien (
$_GET['file'] ).
Vous devez bien sûr contrôler cette variable avant de l'utiliser pour vérifier qu'elle contient bien un entier, sinon, le visiteur peut injecter du code SQL pour vider votre table, la modifier, etc.
Vous devez ensuite mettre à jour le nombre de téléchargements. C'est facile, il suffit d'incrémenter un champ de la table :
Code : SQL | UPDATE upfiles SET up_counter = up_counter + 1 WHERE up_id = ...
|
Je vais maintenant vous montrer le code qui va servir à envoyer le fichier en le commentant un maximum. Surtout, ne vous contentez pas de le copier, comprenez-le ! Si j'ai évité de vous donner trop de code dans ce tutoriel, c'est pour vous forcer à réfléchir. Le but d'un programmeur ou d'un codeur n'est pas de pouvoir copier un bout de code, c'est de pouvoir l'adapter à ses besoins, produire un code optimisé et juste pour chaque application rencontrée.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
/*Après avoir vérifié que le fichier existe (l'id est bien dans la BDD) et
après avoir sélectionné les informations sur le fichier dans la BDD (dans $bdd_infos) */
//Création des headers, pour indiquer au navigateur qu'il s'agit d'un fichier à télécharger
header('Content-Transfer-Encoding: binary'); //Transfert en binaire (fichier)
header('Content-Disposition: attachment; filename="'.$bdd_infos['up_final'].'"'); //Nom du fichier
header('Content-Length: '.$bdd_infos['up_filesize']); //Taille du fichier
//Envoi du fichier dont le chemin est passé en paramètre
readfile($bdd_infos['up_filename']);
?>
|
Le nom du fichier (up_final) correspond au nom que le serveur va proposer au visiteur. Par exemple, si on indique
filename="PD6StdFR6011.exe", voilà à quoi pourrait ressembler la fenêtre de téléchargement :
C'est donc ici que vous pourrez remédier au problème de l'extension (il suffit de l'ajouter au nom de fichier).
Une amélioration possible peut être la nécessité d'être identifié pour télécharger un fichier. En effet, puisque c'est PHP qui gère l'envoi du fichier, vous pouvez facilement contrôler avant le script que le visiteur est connecté. De plus, comme PHP accède aux fichiers en local, vous pouvez placer un .htaccess dans le dossier où se trouvent vos fichiers : de cette manière, vous pourrez empêcher les visiteurs d'accéder au fichier sans passer par le script PHP, qui, lui, n'est pas affecté par le .htaccess.
Création de miniatures
Je ne vais pas m'attarder sur le sujet. En fait, j'ai simplement remarqué que beaucoup de codeurs inexpérimentés avaient du mal avec la création et la gestion de miniatures. Je vais simplement vous donner quelques conseils, mais je ne vais pas vous donner la fonction pour créer des miniatures, ce n'est pas l'objet de ce tutoriel.
Une miniature est une image, qui, comme son nom l'indique, permet d'avoir un aperçu en plus petit d'une image trop grande pour être facilement et rapidement affichée. C'est le cas d'une galerie photo, où on affiche sur une page une série de miniatures, chacune donnant accès, par un simple lien, à l'image de taille réelle.
Une première chose à vérifier, c'est que les miniatures prennent peu de place, aussi bien en taille physique (le nombre de pixels) qu'en poids (le nombre d'octets). Si les miniatures sont trop volumineuses, pensez à réduire la taille ou à diminuer la qualité, sans pour autant la rendre trop floue.
Ensuite, ne placez pas les miniatures dans le même dossier que les originales, placez-les dans un dossier spécial « miniatures » tout en gardant le même nom que l'image originale de façon à pouvoir facilement l'utiliser. En effet, si vous avez comme nom, pour les deux fichiers, « image112 », il vous suffira de changer le dossier pour pouvoir afficher soit l'une, soit l'autre. Vous n'aurez ainsi besoin que d'un seul champ pour les deux noms dans la BDD (
up_filename ). Par exemple :
Code : PHP | <?php
//Après avoir récupéré les infos de l'image dans $bdd_infos
echo "<a href='images/uploaded/".$bdd_infos['up_filename']."'><img src='images/miniatures/".$bdd_infos['up_filename']."'></a>";
?>
|
Pour ce qui est de l'endroit où placer le code pour créer la miniature, c'est bien de le faire juste avant l'insertion des infos du fichier uploadé dans la BDD, sur la page d'upload.