Type de champs à utiliser
On devra disposer au minimum du type de photo : JPEG, GIF, PNG, BMP ... et du champ contenant les données binaires de la photo.
Dans une base MySql, pour les données binaire, on dispose des types suivants :
- tinyblob : 255 octets
- blob : 64 Ko
- mediumblob : 16 Mo
- longblob : 4 Go
Création de la table
CREATE TABLE `photos` ( `id` int NOT NULL, `phototype` varchar(25) NOT NULL DEFAULT 'JPEG', `photodata` blob NOT NULL ); ALTER TABLE `photos` ADD PRIMARY KEY (`id`);
Afin de lier la photo à une fiche d'un individu, d'un objet ou d'un paysage ... contenue dans une table datas
, on aura intérêt à déclarer une foreign key
ALTER TABLE `datas` ADD CONSTRAINT `photos_ibfk_1` FOREIGN KEY (`id`) REFERENCES `datas` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Formulaire d'envoi d'une photo
Le formulaire doit être celui d'un envoi de fichier :
<form name="formphoto" enctype="multipart/form-data" method="post"> <input name="id" type="hidden" value=""> <label>Choisissez le fichier image (JPEG, GIF ou PNG) <input name="filephoto" type="file"></label> <input name="submit" type="submit" value="Envoyer la photo"> </form>
Réception coté serveur
Ne pas oublier que les variables se récupèreront dans la variable globale $__POST
sauf le fichier photo qui sera dans la variable globale $__FILES
.
$ret =is_uploaded_file($__FILES['filephoto']['tmp_name']; if (!$ret) { throw new Exception('Problème de transfert.'); } $filesize = $__FILES['filephoto']['size']; if ($filesize > SIZE_MAX) { throw new Exception('Fichier photo trop gros'); } $phototype = $__FILES['filephoto']['type']; $photodata = file_get_contents($__FILES['filephoto']['tmp_name']); $id = $__POST['id']; // si on travaille en https, il faut ajouter le context dans file_get_contents() $photodata = addslashes($photodata); // indispensable pour enregistrer dans MySql // procédure classique d'enregistrement des données $id, $phototype, $photodata
Affichage de la photo dans une page
Comme il n'y a pas de fichier, on doit envoyer les données binaires de la photo, encodées base64. On pourra utiliser la fonction suivante :
function base64_encode_image($imgdata, $imgtype) { return 'data:image/' . $imgtype .';base64,' . stripslashes($imgdata); }
et on affectera ce résultat à la propriété src
de la balise <img>
comme ceci :
<img src="<?= base64_encode_image($photodata, $phototype);?>">