[RESOLU] Affichage d'une image

Petit nouveau ! | 4 Messages

24 févr. 2014, 18:26

Bonjour,

Tout d'abord mes excuses si le sujet a déjà été traité, mais je ne trouve pas.

Mon problème est le suivant:

J'ai stocké une image dans une base de donnée (ce que je préfère faire plutôt que stocker un lien !) et je peux relire et afficher l'image dans un script avec les trois lignes de code suivantes:

header("content-type:".$ligne[3]);
$truc=$ligne[4];
//echo $truc;

où ligne est le résultat d'une requête dans ma table.


Il n'y a aucun autre affichage, c'est ok, ça fonctionne.

Mais j'ai besoin d'afficher d'autres choses (il s'agit de fiches concernant des collections, donc descriptions et photos). Pour ce faire j'ai lu qu'il faut procéder en utilisant un script appelé depuis mon script principal. J'ai donc essayé, et parce que ça ne fonctionnait pas, et que je pensais que c'était à cause du passage des paramètres j'ai simplifié pour tester en faisant un appel à un script affichant une image du dossier, soit le scipt suivant:

<?php
//$genre=_GET('genre');
//truc=$_GET('truc');

//header('content-type:image/jpg');
//echo $truc;



echo "<img src = \"a11.jpg\">"; // Je n'ai gardé que cette ligne

?>




et l'appel:

//echo"<img src = \"script_affiche.php?genre='.$ligne[3];'&truc='.$ligne[4];'./>";
//echo "<img src = \"a11.jpg\">";
echo "<img src = \"script_affiche.php\">"; // Je ne garde que ça


A l'exécution:


j'ai un petit carré (lien brisé?) mais un clic droit et afficher image permet d'afficher effectivement l'image. Qu'ai-je donc oublié dans l'histoire ?

Merci de vos suggestions

Philippe LAFFEZ

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 févr. 2014, 19:50

salut,

je suis désolé mais ta demande est incompréhensible :)

essai de nous refaire un truc plus clair en détaillant bien.

tous ce que tu je peux te dire, c'est qu'effectivement il faut que tu appel un fichier php dans le "src" de la balise img.

ensuite tu peux très bien passer ds paramètre à ce script pour fournir l'image dynamiquement.
Je suppose dans la table qui contient les images il y a un moyen pour les relier aux fiches, comme par exemple la clef primaire de la fiche ?
dans ce cas tu n'a besoin de passer en paramètre que cette clef primaire pour réaliser la requête et afficher l'image.

Lorsque l'image ne s'affiche pas c'est parfois qu'i ly a une erreur php, que tu ne verras pas car envoyer comme étant une partie de l'image;
dans ce cas tu peux ouvrir le fichier généré avec un éditeur de texte (notepad, notepad++ etc tec). et tu y verra l'erreur.
L'erreur qui va avec c'est : "**blablabla le fichier est corrompu".

il est aussi possible que le lien en lui même ne soit pas bon.
est tu certain que le fichier script_affiche.php est dans le même répertoire que le fichier qui affiche ce code html ?

sans plus de code (utilise les balise php / html etc) et une explication plus claire on ne pas t'aider plus.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 83 Messages

24 févr. 2014, 21:33

+1 moogli

Petit nouveau ! | 4 Messages

25 févr. 2014, 11:16

Désolé, je pensais être clair. Je reprend donc en simplifiant pour ne traiter qu'un problème. J'ai d'ailleurs continué à chercher hier soir et ai conclus que le script appelé n'est pas exécuté:

Je simplifie en oubliant 5 minutes l'utilisation de la base de données:

L'appel du scipt par:

echo "<img src = \"script_affiche.php\">";

ne provoque pas l’exécution de ce dernier, mais l'affichage d'une page avec un petit carré (firefox ou internet explorer même combat !):

Si je fais un clic droit et choisi l'option afficher l'image" du menu contextuel, le script est exécuté et l'image affichée !

Voici le script, pour l'affichage d'une image stockée sur disque:
<?php
//$genre=_GET('genre');
//truc=$_GET('truc');

//header('content-type:image/jpg');
//echo  $truc;
echo "<img src = \"a11.jpg\">";

?>

Il n'y a pas d'erreur php (j'en veux pour preuve qu'en introduisant une erreur dans le script d'affichage, le comportement est le même, avec affichage de l'erreur php APRES le clic droit !

Pourquoi ce comportement ? Je ne comprend pas.


J'espère que cette fois-ci c'est clair,bien que long.

Merci d'avance



J'ai pas mal d'expérience en programmation, mais pas en php (pascal et delphi). Il y a quelque chose qui m'échappe. Je procède toujours en découpant les gros problèmes en plus petits et en général ça va.


Voici les scripts complets quand même , pour info. Je me suis inspiré de choses trouvées sur le net (merci à ceux qui ont mis ces infos en ligne):

Le premier permet d’enregistrer les données d'un formulaire dans deux tables. Seule la partie image est pour le moment écrite (et fonctionne, le champ blob est bien rempli. Au final, il est censé afficher les données écrites, pour contrôle:

(la partie affichage de l'image de la base de données est en commentaire pour ne garder que ce qui est décrit ci dessus)
<?php

function transfert($connexion)
{
  $ret=false;
  $img_blob='';
  $img_taille=0;
  $img_type='';
  $img_nom='';
  $taille_max=250000;
  $ret=is_uploaded_file($_FILES['fic']['tmp_name'])	;
  if(!$ret)
  {
  echo "Problème de tranfert"	;
  }
 else  {
 	// fichier bien reçu
	$img_taille=$_FILES['fic']['size'];
	$img_nom=$_FILES['fic']['name'];
	$img_type=$_FILES['fic']['type'];
//	echo "fichier :   ".$_FILES['fic']['tmp_name'];
//	echo "<br>";
//	echo "taille :   ".$_FILES['fic']['size'];
//	echo "<br>";
	
	
	// Vérification de la taille maximale du fichier:
	
	$requete = "select * from les_collec where id_les_collec = ".$_POST['D2'];
//	echo  $requete;
//	echo "<br>";
		        $resultat_taille = mysqli_query($connexion,$requete) or die("Impossible de récupérer la taille maximale autorisée des fichiers");
				
		// $nblignes = mysqli_num_rows($resultat_taille);	Inutile car il ne peut y avoir qu'un enregistrement
		     $ligne= mysqli_fetch_row($resultat_taille);		
		$taille_max= $ligne[2];
//		echo $taille_max;
//			echo "<br>";
		
		if($img_taille>$taille_max) {
			echo "Image trop grosse";
//				echo "<br>";
		}
		else {
			
// Récupération du fichier:

$img_blob=file_get_contents($_FILES['fic']['tmp_name']);

// Enregistrement de l'image dans la table

$req = "INSERT INTO images (".
"img_nom, img_taille, img_type, img_blob ".
") VALUES (".
"'".$img_nom."', ".
"'".$img_taille."', ".
"'".$img_type."', "."'".addslashes($img_blob)."') ";

//echo $req;

$resultat = mysqli_query($connexion,$req) or die("Impossible de stocker l'image du registre");
//	echo "<br>";
	
	// affichage, pour test
	
	$req = "SELECT * FROM images ORDER BY img_id DESC LIMIT 0, 1";
//	echo $req;
//	echo "<br>";
	$resultat = mysqli_query($connexion,$req) or die ('récupération image impossible');
				     $ligne= mysqli_fetch_row($resultat);
$req = "select * from images where img_id = ".$ligne[0];
//echo $req; 
//echo "<br>";
					 
					 $resultat = mysqli_query($connexion,$req) or die ('récupération image impossible');
				     $ligne= mysqli_fetch_row($resultat);


	if(isset($ligne[0]))
	{
	
	//  création page HTML_
//echo'	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
//echo"<html>";
//echo"<head>";
//echo '<meta http-equiv="Content-Language" content="fr">';
//echo'<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">';
//echo"<title>Création entrée du registre</title>";
//echo "</head>";
//echo"<body>";	
	

//echo "0    ".$ligne[0]."<BR>";
//echo "1    ".$ligne[1]."<BR>";
//echo "2    ".$ligne[2]."<BR>";
//echo "3    ".$ligne[3]."  Header<BR>";
//echo "4    ".$ligne[4]//."   IMAGE <BR><BR>";
//header("content-type:".$ligne[3]);
$truc=$ligne[4];
//echo $truc;

//echo"<img src = \"script_affiche.php?genre='.$ligne[3];'&truc='.$ligne[4];'./>"; 
//echo "<img src = \"a11.jpg\">";
echo "<img src = \"script_affiche.php\">";

//echo'<img src = \"script_affiche.php?truc='.$truc.' \">'; 
//							echo $ligne[0];

	}

// Récupération de l'index de l'image

// Enregistrement dans le registre
			
		}
		
		
//	echo "<br>";
	
	
	
  	
  }
}


// Petit script pour afficher les paramètres transmis par un formulaire
	//foreach($_POST as $champ => $valeur )
//		{
//			echo "$champ = $valeur <br>";
//}

// Connexion à la base de données:


   $hote = "localhost";
   $utilisateur = "root";
   $passw = "root";
   $nombase = "collections";
      $connexion = mysqli_connect($hote,$utilisateur,$passw,$nombase)
      or die("Connexion );impossible à la base de données collections");

if(isset($_FILES['fic']))
{
	transfert($connexion);		

}
else{
	echo "ça ne passe pas";
}
						
echo"</body>";	

Eléphant du PHP | 83 Messages

25 févr. 2014, 11:53

Bonjour,

a la première lecture j'ai remarqué que tu fait :
L'appel du scipt par:

echo "<img src = \"script_affiche.php\">";
et dans le fichier "script_affiche.php" tu à :
Voici le script, pour l'affichage d'une image stockée sur disque:

<?php
//$genre=_GET('genre');
//truc=$_GET('truc');


//header('content-type:image/jpg');
//echo $truc;
echo "<img src = \"a11.jpg\">";



?>
on exécutant ce script tu introduit dans l'attribut "srs" de l'image :
echo "<img src = \"script_affiche.php\">";
une balise "img" html ce qui donnerait quelque chose comme :
<img src=" <img src=""> ">
vue que ton scripte php retourne :
echo "<img src = \"a11.jpg\">";
je pense que c'est la votre erreur :)

d'autre part, moi aussi je suis Delphiste :)

Bon Codage

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 févr. 2014, 15:15

Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Il en faut peu pour être heureux ......

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 févr. 2014, 15:24

pour être plus précis sur la façon de faire (pseudo code)

il faut passer par l'url l'identifiant de l'image à afficher : <img src = "script_affiche.php.idImage=412" />
script : script_affiche.php
- Est ce que l'id est présent en parmaètre d'url ?
=> si non on ne fait rien
=> si oui
- select img_blob from images where img_id=xxx où xx provient de l'url
- est ce qu'il y a une ligne de résultat ?
=> si non stop
=> si oui
- Envoyer l'image avec les bonnes infos dans l'entête http (content type etc)

Penser à fermer les ressources ouvertes

en suivant cet algo c'est simple à faire.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

25 févr. 2014, 16:50

Je crois que j'ai compris. Ce n'était finalement pas une si bonne idée cette simplification.

Je vais reprendre et lorsque ça ira, je reviendrai

Philippe

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 févr. 2014, 19:15

La mauvaise idée c'est de mettre les fichiers dans la base qu'elle prend du bide pour des données statique qui n'ont pas besoin de demander autant de ressource ;)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

03 mars 2014, 18:09

Finalement le problème doit venir du passage des paramètres. on se noie facilement dans les ',(,. et autres "bidules" nécessaires au traitement des chaines de caractères en php. J'ai donc opté pour passer comme paramètre l'identificateur de l'image plutôt que son type et l'image elle même, et récupération dans le script d'affichage. cela donne:


script_affiche_2.php
<?php

// Affiche une image de la table image: on passe son id comme paramètre



   $hote = "localhost";
   $utilisateur = "root";
   $passw = "root";
   $nombase = "collections";
      $connexion = mysqli_connect($hote,$utilisateur,$passw,$nombase)
      or die("Connexion );impossible à la base de données collections");
	$req = "SELECT * FROM images WHERE img_id = ".$_GET['num_img'];
						 $resultat = mysqli_query($connexion,$req) or die ('récupération image impossible');
				     $ligne= mysqli_fetch_row($resultat);

header('Content-type:image/jpg');
header('Content-type:'.$ligne[3].'\'');
 echo $ligne[4];
			 

?>


L'utilisation pour afficher l'image dans une fiche (ici un petit tableau de 2x2 cases)

echo "<table border=\"1\" width=\"50%\">";
echo "	<tr>";
echo "		<td>&nbsp;";
echo  '<img src = "script_affiche_2.php?num_img='.$ligne[0].'"/>'; 
echo "</td>";
echo "		<td>&nbsp;</td>";
echo "	</tr>";
echo "	<tr>";
echo "		<td>&nbsp;</td>";
echo "		<td>&nbsp;</td>";
echo "	</tr>";
echo "</table>";




Ce n'est pas très beau à voir mais je suis un peu faignant, donc j'ai fait le tableau avec frontpage et "traduit" le code html avec un petit programme delphi pour ne pas avoir à me taper tout le design à la main.

Ca marche bien.





Enfin, pour finir, la structure de la table image:

img_id bigint(20)
img_nom varchar(100)
img_taille varchar(25)
img_type varchar(25)
img_blob blob


Dernière chose: J'ai préféré mettre les images dans une (ou plusieurs) tables plutôt qu'en extérieur car il s'agit de petites images, nombreuses, et que je sais pour l'avoir expérimenté que lorsqu'on a de nombreux fichiers on a toujours un risque de pertes lors de transfert d'un support à un autre (ce qui sera mon cas, puisque je travaille avec uwam autonome sur plusieurs pc, à la maison ou au bureau. Il y a aussi un risque de "bordelisation"