Académique Documents
Professionnel Documents
Culture Documents
Le but de ce document est de donner les principes de manipulation de fichiers dans une table mysql,
à partir de php.
On va partir d'un fichier existant, avec comme exemple un fichier gif.
On suppose le fichier déposé à un endroit accessible; ici il sera dans le dossier du script php.
On suppose une base de donnée mysql créée et accessible par un nom d'utilisateur et un mot de
passe.
Dans ce document on verra comment stocker ces fichiers dans une table mysql, comment l'afficher
dans une page web et comment en regénérer un fichier.
Tous les exemples donnés sont fonctionnels, mais sont limités aux instructions permettant le
fonctionnement de l'exemple, en excluant toute considération « environnementale ». Pour autant,
toutes les étapes seront commentées de façon à fournir un maximum d'aide.
Selon les versions php et mysql utilisées, il peut-être nécessaire de revoir les scripts.
Création de la table:
Nous allons créer la table « fichiers » ou seront stockés les fichiers; il faut exécuter la commande
SQL de création de la table suivante:
Cette commande peut-être exécutée en mode ligne ou via l'interface phpMyadmin de notre serveur
mysql, ou encore incluse dans un script php; on ne détaillera pas ce point.
La table ainsi créée comporte un identifiant Id, un Titre pour le fichier stocké (qui peut également
être le nom du fichier), les données du fichier, ainsi que le type de données.
Le type blob des données indique que ces données sont stockées sans modification (liés à une table
de caractères, suppression des blancs ou autre), contrairement à ce qui peut se passer pour des types
du genre varchar ou text; longblob indique aussi la taille maximum des données qui peuvent être
stockées (tinyblob <256 octets, blob<65536, longblob<4294967296!). Attention, les données sont
stockées non compressées, et demande donc l'espace disque adéquat. De plus, il faut tenir compte
des capacités d'échanges entre le client et le serveur. Il est donc conseillé de tester les tailles limites
Connexion à la base:
define ("MACHINE", "serveur.mondomaine") ;
define ("UTILISATEUR", "mon_nom") ;
define ("BASE", "ma_base") ;
define ("MOT_DE_PASSE", "mon_mot_de_passe") ;
define ("TABLE", "fichiers") ;
define ("FICHIER", "image.gif") ;
Les définitions précédente devront être mises de préférence dans un include non accessible du
serveur web, pour des raisons de sécurité. Ici, nous inclurons ces définitions dans le script unique
pour des raisons de clarté.
if ( mysql_select_db(BASE) == false )
die ("Base de donnée inaccessible\n") ;
A ce point nous sommes connectés à la base et nous pouvons manipuler les données.
Après avoir défini le titre et le type du fichier (nous reviendrons en annexe sur la détermination du
type de fichier), on ouvre le fichier par l'instruction fopen qui retourne une ressource de gestion de
fichier; on détermine ensuite la taille du fichier. Pour le fopen, on utilise aussi le @ pour éviter les
messages d'erreurs éventuels, erreurs que l'on gère en testant le retour (erreur si retour faux) et en
terminant le script avec un message d'erreur adapté si besoin. La lecture des données suit avec la
fonction fread (de préférence utiliser file_get_contents qui permet de meilleures performances) qui
A ce stade, nous avons réussi à stocker un fichier dans une table de la base MySql.
On peut penser à récupérer l'identifiant pour une utilisation ultérieure, puisque la fonction d'auto-
incrément de mysql génère automatiquement un nouvel Id à chaque insertion.
$id= mysql_insert_id();
print "Numéro d'identifiant dans la table: $id<br>\n";
On commence donc par lire l'identifiant demandé, avec une conversion en nombre entier
simplement pour éviter qu'un plaisantin tente de forger une requête SQL non prévue en mettant
?id=chaine_de_caracteres_pas_sympa.
Lorsqu'un fichier doit être traité, le logiciel de traitement doit savoir comment traiter les données
qu'il contient. Certains logiciels ne peuvent traiter qu'un format de données, et ne se posent donc pas
de question. D'autres au contraire, comme les navigateurs, les afficheurs d'images ou les logiciels de
traitement de texte, doivent pouvoir traiter différemment les données suivant leur format:
- pages html, images jpeg, video, microsoft word, wordperfect, pdf etc...
Pour cela, différents moyens sont utilisés, certains pouvant être combinés:
- association par l'extension: c'est ce qui se passe quand windows vous demande avec quoi ouvrir tel
document; vous choisissez un logiciel adapté et windows associe l'extension du fichier au logiciel
en question. Tous les fichiers seront donc traités par ce logiciel, qui appliquera un traitement
standard ou qui précisera son traitement par la méthode ci-dessous:
- reconnaissance d'une zone d'en tête: en général, les fichiers commencent par une zone d'en tête
spécifique à leur format; en ouvrant avec un éditeur quelconque un fichier gif, on remarquera le
GIF89 en début de fichier; %PDF-1.4 sera l'en tête d'un fichier pdf etc... Grâce à cette entête le
logiciel saura comment traiter les données suivant leur format.
-indication du mime type, notamment par l'indication content-type=... Des valeurs comme:
text/html, image/png, image/gif, video/mpeg, text/css , application/x-excel
sont connues, et sont associées aussi à des extensions « standards ».
Pour revenir à notre sujet, nous avons indiqué dans notre script de mise en table du fichier:
$type='image/gif'
Pour cela, nous avons simplement exprimé que nous savions que le fichier traité était un fichier gif,
son type mime étant alors image/gif. Nous avons alors indiqué au navigateur dans l'entête de la
réponse HTTP à l'interrogation du script:
header("Content-type: $type");
indiquant ainsi au navigateur quoi faire des données qui allaient suivre, car le navigateur possède
une table de correspondance entre les types de données et l'action à déclencher.
Pour autant, si l'on sait comment indiquer quoi faire des données, comment déterminer le type de
données lorsqu'un fichier est inconnu, ou que l'on veut pouvoir traiter différents types de fichiers?
Il ne semble pas y avoir de réponse vraiment universelle, mais plutôt des moyens d'y arriver dans
presque tous les cas:
- examen de l'extension (s'il y en a une, et si elle correspond bien au type de fichier).
- décodage de l'entête (si on se limite à quelques cas connus!).
- détermination du type de données par les fonctions du module php fileinfo, si installé, qui utilise
un fichier magic.mime pour tenter de déterminer le type du fichier.
- utilisation du content-type fourni en cas d' upload depuis un navigateur. Le type file d'un élément
input de formulaire dont enctype="multipart/form-data" comme ci-dessous:
<FORM enctype="multipart/form-data" ACTION="script.php" METHOD="POST">
<input type="file" name="toto" size="35">
permet, lors de l'envoi, de récupérer le type de fichier, bien sur fourni par le navigateur.
$type = $_FILES['toto']['type'];