Plaatje in MySQL

  • Onderwerp starter Onderwerp starter JJK
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

JJK

Gebruiker
Lid geworden
6 nov 2003
Berichten
99
Hallo,

ik wil een plaatje in MySQL opslaan, en vervolgens weer uitlezen in een webpagina, bijvoorbeeld:
Code:
<img src="http://voorbeeld.nl/plaatjes.php?id=1" alt="Het eerste plaatje" />
Hier volgt de volgende concrete vraag uit:

Hoe kan ik een plaatje opslaan in een MySQL database (met informatie zoals het MIME-type) en het weer uitlezen in een webpagina (zo dat het wordt gezien als het juister formaat?

Ik heb al aan iets als dit zitten denken:
PHP:
<?php
$id = strip_tags($_GET['id']);
$query = "SELECT data, type FROM plaatjes WHERE id= $id";
$res_plaatje = mysql_query($query);
$data_plaatje = mysql_fetch_assoc($res_plaatje);
header("Content-Type: " . $data_plaatje['type']);
echo $data_plaatje['data'];
?>
Volgens mij moet dit werken en dan rest alleen nog de vraag hoe ik ze (bijvoorbeeld via een web-interface) erin krijg. Als het mogelijk is uiteraard met zo min mogelijk risico ;)

PS. Voor die URI zou ik zelf een rewrite gebruiken. Dit is alleen voor de duidelijkheid.
 
Hier heb ik zelf laatst ook nog mee zitten worstelen, dit werkte wel:
PHP:
header( 'Content-type: image/' . str_replace( 'jpg', 'jpeg', $row['ext'] ) );
if( $row['ext'] == 'jpg' OR $row['ext'] == 'jpeg' )
{
  $src_img = @ImageCreateFromJPEG( 'photos/big/' . ( (int) $_GET['pid'] ) . '.' . $row['ext'] );
  @ImageJPEG( $src_img );
}
elseif( $row['ext'] == 'gif' )
{
  $src_img = @ImageCreateFromGIF( 'photos/big/' . ( (int) $_GET['pid'] ) . '.' . $row['ext'] );
  @ImageGIF( $src_img );
}
elseif( $row['ext'] == 'png' )
{
  $src_img = @ImageCreateFromPNG( 'photos/big/' . ( (int) $_GET['pid'] ) . '.' . $row['ext'] );
  @ImagePNG( $src_img );
}

ImageDestroy( $src_img );
Maar dit weer niet:
PHP:
header( 'Content-type: image/' . str_replace( 'jpg', 'jpeg', $row['ext'] ) );
echo file_get_contents( 'photos/big/' . ( (int) $_GET['pid'] ) . '.' . $row['ext'] );
Ik moet zeggen, ik vond en vind 't heeeeel apart. Zal er morgen es ff navraag over doen :)


Overigens zal jij in jouw geval niet ImageCreateFromJPEG() / ImageCreateFromGIF() / ImageCreateFromPNG() gebruiken, maar ImageCreateFromString() (denk ik, geen ervaring mee).

Waarom zet je trouwens zulke grote data in je database en sla je ze niet gewoon als bestanden op ? Je database wordt er aardig wat trager door namelijk (tenzij je de bron van de foto's in een aparte tabel opslaat).
 
Goed, ff nader onderzocht, waarom hij het met file_get_contents() niet doet, geen idee. Wat ik wel weet is dat het met readfile() wel werkt ! :):cool:
 
JPeetje, bedankt voor je reactie. Ik ga het zsm uitproberen.

Het "gewoon" opslaan van bestanden is voor mij geen optie, omdat ik anderen een plaatje wil laten uploaden. Maar om m'n dirs nu world-writable te maken...
...tenzij je de bron van de foto's in een aparte tabel opslaat...
Dat was ik ook van plan. Een tabel met drie velden (id, date en type)
In ieder geval bedankt. Je hoort nog van me of het gelukt is.
 
Het is dus uiteindelijk gelukt (na een lange tijd dat ik geen tijd had om te testen :().
De code is als volgt:
PHP:
$db->Connect();
$ImageResource = $db->Select($ImageQuery);
$db->Disconnect();

// Is only one image loaded?
if (1 == $db->NumRows($ImageResource))
{
	$ImageResult = $db->Fetch($ImageResource);

	switch ($ImageResult['type']) {
		case 'gif':
		{
			header( 'Content-type: image/gif');
			$Image = imagecreatefromstring($ImageResult['data']) or die("Error! Creating image failed!");
			imagegif($Image);
			ImageDestroy($Image);
			break;
		}
		case 'jpeg':
		case 'jpg':
		{
			header( 'Content-type: image/jpeg');
			$Image = imagecreatefromstring($ImageResult['data']) or die("Error! Creating image failed!");
			imagejpeg($Image);
			ImageDestroy($Image);
			break;
		}
		case 'png':
		{
			header( 'Content-type: image/png');
			$Image = imagecreatefromstring($ImageResult['data']) or die("Error! Creating image failed!");
			imagepng($Image);
			ImageDestroy($Image);
			break;
		}
		default:
		{
			echo "Type is: " . $ImageResult['type'];
			break;
		}
	}


} else {
	echo "Geen of meerdere images!";
}
Uiteraard is dit nog voor verbetering vatbaar, maar het werkt in ieder geval. Bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan