Stocker images et .zip dans une BD via PHP - PHP - Programmation
Marsh Posté le 31-05-2010 à 15:22:36
ce n'est vraiment aps une bonne idée dans le cas général( la base de données grossis très vite et perds en performance)
En général on stocke le chemin en bdd et le reste dans un répertoire à côté.
Toutefois, si tu y tiens vraiment, il faut nous montrer ton script qui est chargé de la lecture
Marsh Posté le 31-05-2010 à 15:42:42
flo850 a écrit : ce n'est vraiment aps une bonne idée dans le cas général( la base de données grossis très vite et perds en performance) |
vous avez raison. mais le laboratoire où j'effectue mon stage me demande d'insérer dans une base de données avec le champ BLOB
Voici mon code : ce code il me permet d'ajouter ke le chemin des fichiers dans la base de données
$identifiant = 124193;
//création des deux tableaux. un qui contient les .png et l'autre qui contient les fichiers des configurations (.dat, .text, ...)
$rep = "./simulation/simulation_morphologique/"; // répertoire qui contient tous les fichiers
$fichiers = array(); // un table qui contient tout les fichiers
$resultats = array(); // un table qui contient que les images .png
$configuration = array(); // un table qui contient les autres extensions (.text, .dat, ..)
$dir = opendir($rep); // ouvre le répertoire
// lire le répertoire qui contient les fichiers
while($f = readdir($dir))
{
if(is_file($rep.$f))
{
array_push($fichiers, "$f" ); // insérer le fichier dans $fichiers
}
}
closedir($dir);
//tester l'extension des fichiers dans la table fichiers
foreach($fichiers as $keyFichier)
{
$extension = substr("$keyFichier", -3, 3);
$file = "$rep$keyFichier";
if($extension == "png" )
{
array_push($resultats, "$file" );
}
else
{
array_push($configuration, "$file" );
}
}
$sizeRes = sizeof($resultats);
$sizeConf = sizeof($configuration);
//création du fichier .zip pour les fichiers de configurations (.text, .dat, ...) avant de l'inserer dans la base de données.
$zip = new zipfile () ; //on crée une instance zip
// liste des fichiers à compresser
$i = 0 ;
while ( count($configuration) > $i )
{
$fo = fopen($configuration[$i],'r') ; //on ouvre le fichier
$contenu = fread($fo, filesize($configuration[$i])) ; //on enregistre le contenu
fclose($fo) ; //on ferme fichier
$zip->addfile($contenu, $configuration[$i]) ; //on ajoute le fichier
$i++; //on incrémente i
}
$archive = $zip->file() ; // on associe l'archives
// on enregistre l'archive dans un fichier
$open = fopen( "./simulation/simulation_morphologique/config$identifiant.zip" , "wb" );
fwrite($open, $archive);
fclose($open); //fin zip
$commande = "./simulation/simulation_morphologique/config$identifiant.zip";
// insertion les fichiers de la configuration dans la base de données (fichier .zip)
$insertion = mysql_query("INSERT INTO commande VALUES ('$identifiant', '$date_creation', '$utilisateur', 'morpho', '$commande')" ) or die(mysql_error());
// insertion les résultats associé à la commande dans la base de données
foreach($resultats as $keyResultats) // les images
{
$insertion = mysql_query("INSERT INTO data VALUES ('', '$identifiant', '$keyResultats')" ) or die(mysql_error());
}
// supprimer les fichiers (commande + résultats) de la répértoire
foreach($fichiers as $keyfichiers)
{
$file = "./simulation/simulation_morphologique/$keyfichiers";
unlink("$file" );
}
// chercher les images dans la base de données
$reponseVisu = mysql_query("SELECT * FROM data WHERE id_commande = $identifiant" ) or die (mysql_error());
while($donneesVisu = mysql_fetch_array($reponseVisu))
{
echo "<a href='$donneesVisu[data]'><img class='' src='$donneesVisu[data]'/></a>";
}
Marsh Posté le 31-05-2010 à 15:48:21
src='$donneesVisu[data]' , n'affichera rien si $donneesVisu[data] n'est aps un chemin ( a la limite tu peut tenter une image inline mais c'est un peu plus complexe )
tu veux mettre tes fichiers dans quelle base ? quel est ton champ blob ?
Marsh Posté le 31-05-2010 à 15:54:49
flo850 a écrit : src='$donneesVisu[data]' , n'affichera rien si $donneesVisu[data] n'est aps un chemin ( a la limite tu peut tenter une image inline mais c'est un peu plus complexe ) |
J'ai deux tableaux une table "commande" et l'autre "data"
table commande : dans cette table je veux insérer le fichier .zip
CREATE TABLE IF NOT EXISTS `commande` (
`id_commande` int(11) NOT NULL,
`date_creation` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`utilisateur` varchar(255) CHARACTER SET latin1 NOT NULL,
`type_commande` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`commande` blob NOT NULL,
PRIMARY KEY (`id_commande`),
KEY `utilisateur` (`utilisateur`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
table data : dans cette table je veux insérer les images .png
CREATE TABLE IF NOT EXISTS `data` (
`id_data` int(11) NOT NULL AUTO_INCREMENT,
`id_commande` int(11) NOT NULL,
`data` blob NOT NULL,
PRIMARY KEY (`id_data`),
KEY `id_commande` (`id_commande`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;
Marsh Posté le 31-05-2010 à 16:57:40
$keyresultats contient le nom du fichier ( tu le mets toi meme dans resultats
donc il faut inserer un readfile($keyResultat) ( d'ailleurs , c'est quoi cette variable qui a un nom qui ne veut rien dire ? )
ensuite il faut encoder ça pour que l'insertion ne pete pas à la gueule , donc tu fais
Code :
|
Marsh Posté le 31-05-2010 à 17:12:09
flo850 a écrit : $keyresultats contient le nom du fichier ( tu le mets toi meme dans resultats
|
après l'éxcecution de ce code je fais
$reponseVisu = mysql_query("SELECT * FROM data" ) or die (mysql_error());
while($donneesVisu = mysql_fetch_array($reponseVisu))
{
echo "<a href='$donneesVisu[data]'>$donneesVisu[id_commande]</a><br/>";
}
et kan je clique sur le lien il m'affiche une message d'erreur Objet non trouvé !
Marsh Posté le 31-05-2010 à 17:27:02
faut faire un lien de type data, mais il te faut le MIME, mais bon c'est pas top comme technique je rejoins flo850 dans ca première réponse
Marsh Posté le 01-06-2010 à 12:05:32
bonjour,
tjs j'ai des problèmes. des aide svp ?? Merci
A+
Marsh Posté le 01-06-2010 à 13:55:03
la méthode propre :
En aucun cas tu ne mets le contenu de l'image dans un lien
Marsh Posté le 01-06-2010 à 15:00:57
flo850 a écrit : la méthode propre :
|
je fais comme ca alors :
$reponseVisu = mysql_query("SELECT * FROM data" ) or die (mysql_error());
while($donneesVisu = mysql_fetch_array($reponseVisu))
{
echo "<input type='hidden' name='id' value='$donneesVisu[id_data]'/>
<a href='afficher_image.php?id=$donneesVisu[id_data]'>$donneesVisu[data]</a>";
}
et dans afficher_image.php : qu'est ce quoi je dois metrre ?? excuse moi mais j'arrive pas à voir la solution merci de m'aider.
si je fais ça; il m'aafiche rien
$requete = "SELECT * FROM data WHERE id_data=$id";
$resultat = mysql_query($requete);
$donnees = mysql_fecth_array($resultat);
$image = $donnees['data'];
echo "$image";
A+
Marsh Posté le 03-06-2010 à 11:01:06
flo850 a écrit : En aucun cas tu ne mets le contenu de l'image dans un lien |
Les Data URI c'est pas non plus toujours si incohérent que ça si les ressources ne sont pas volumineuses, on gagne pas mal en overhead HTTP, surtout en HTTPS et aussi on gagne l'overhead d'un éventuel framework.
Marsh Posté le 31-05-2010 à 15:18:41
Bonjour,
en fait, je lance un script PHP, ce script il lance un programme externe qui génère des images et il mets ces images dans un répertoire. moi je veux mnt via php d'aller chercher ses images et l'insérer dans une base de données dans un champ de type BLOB puis les supprimer du répertoire .......
j'ai créer une table qui contient un champ de type BLOB, et j'ai effectue l'insertion normal mais celle ça ne marche pas; il sauvegarde que le chemin de fichier dans la base... du coup kan je supprime le fichier du répertoire j'arrive plus à l'afficher dans ma page ..
Merci pour votre aide, c'est vraiment très urgent
A+