[PHP/MySQL] Afbeelding uit database tonen

Pagina: 1
Acties:
  • 1.318 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
In een database heb ik een afbeelding opgeslagen(BLOB). Deze heb ik met het volgende stukje PHP-code erin gezet:

PHP:
1
2
3
4
$afb  = $_FILES['afbeelding'][tmp_name]; 
$handle   = fopen($afb, "r"); 
$filedata = base64_encode(fread($handle, filesize($afb))); 
$query = "insert into foto(Fotonaam, Foto, Foto_omschrijving) values('$fotonaam', '$filedata', '$afbo');";


In de database zit nu een jpg-tje opgeslagen. Maar hoe laat ik deze nu verschijnen op de een website? Daar heb ik gisteren de hele avond mee zitten prutsen, maar alles wat ik tegenkom werkt niet. Volgens meerdere bronnen moet de php-code daarvoor zijn:

PHP:
1
2
3
4
5
6
7
$query = "select Fotonaam, Foto, Foto_omschrijving from foto where Fotonr = $fotonr;";
$result_idfoto = mysql_query($query, $db);
$resultsfoto = mysql_fetch_array($result_idfoto);

header( "Content-type: image/jpg");
print base64_decode($resultsfoto[Foto]);
print $resultsfoto[Foto_omschrijving];


Dit geeft als resultaat de foto, maar hij print de foto_omschrijving niet meer, hij houdt dus op met het verder verwerken van de pagina.

En als ik deze code midden op een grotere pagina zet, op een profielpagina met naam, adres enzo, dan krijg ik de error 'Cannot modify header information - headers already sent'.

Conclusie: hij laat alleen de afbeelding zien en stopt met het verder verwerken van de site, behalve als er al een stuk site is geweest, dan geeft hij een error. Maar hoe moet ik dan omgaan met een afbeelding uit een database?

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dat lijkt me ook redelijk logisch. Er is een groot verschil tussen een afbeelding en een html pagina. Als je een omschrijving eronder wilt hebben zul je een html pagina moeten maken waarmee je middels de img tag het plaatje ophaalt (wat dus dat script is dat je nu ook hebt) en los de omschrijving er onder afdrukken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
TerraGuy schreef op vrijdag 26 januari 2007 @ 13:12:
PHP:
1
2
3
header( "Content-type: image/jpg");
print base64_decode($resultsfoto[Foto]);
print $resultsfoto[Foto_omschrijving];


Conclusie: hij laat alleen de afbeelding zien en stopt met het verder verwerken van de site, behalve als er al een stuk site is geweest, dan geeft hij een error. Maar hoe moet ik dan omgaan met een afbeelding uit een database?
Logisch; je output binary data (en dat zou dus alleen de image moeten zijn). Daar hoort geen HTML achteraan te komen.

edit: Wat ^^ dus zegt :P

[ Voor 3% gewijzigd door RobIII op 26-01-2007 13:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • roan
  • Registratie: December 2003
  • Niet online
Of je zet de omschrijving in het plaatje dmv gd

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Het is wel mogelijk om in plaats van een URL naar een afbeelding direct in een pagina te plaatsen.

code:
1
<img src="data:image/jpeg;base64,AAABAAEAEBAAAAEACABoBQA...">

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Janoz schreef op vrijdag 26 januari 2007 @ 13:15:
Dat lijkt me ook redelijk logisch. Er is een groot verschil tussen een afbeelding en een html pagina. Als je een omschrijving eronder wilt hebben zul je een html pagina moeten maken waarmee je middels de img tag het plaatje ophaalt (wat dus dat script is dat je nu ook hebt) en los de omschrijving er onder afdrukken.
Dat leek mij ook logisch, maar er staat dus nergens bij wat je moet doen als je meer wilt dan louter die afbeelding. :) Daarom weet ik ook niet hoe ik het dan wél moet behandelen.

Maar goed, wat bedoel je precies met 'middels img tage plaatje ophalen'? Zoiets als dit:
PHP:
1
print "<img src='". header('Content-type: image/jpg'); print base64_decode($resultsfoto[Foto]) . "' alt='bla' />";

Wat in deze vorm niet werkt trouwens, maar zit ik in de richting?

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • marko77
  • Registratie: Februari 2002
  • Laatst online: 06-05 19:41
imo moet je plaatjes helemaal niet opslaan in een database. Ik zou de naam (en evt.locatie) van het plaatje in de database opslaan en dan html genereren die het plaatje en de omschrijving weergeeft.

Het is mij echter niet duidelijk in wat voor context je precies werkt én wat je wilt bereiken.

Mijn rig


Acties:
  • 0 Henk 'm!

  • GeleFles
  • Registratie: Augustus 2001
  • Niet online

GeleFles

What's in a bottle?

de fout die je krijgt, komt omdat je nogmaals je header probeert te schrijven, terwijl je al in de body van je html pagina zit.

header( "Content-type: image/jpg");
met dat commando roep je dus de header van de pagina aan, en niet je van je image.

maar ben het met marko eens, ik zou geen zinnige reden kunnen verzinnen om bij elke pagerequest, de image uit een database te halen, en door je webserver te laten opbouwen...

Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Het betreft een test van een website waarbij er een aantal gebruikers zich aangemeld hebben. Als je dan op een gebruiker klikt krijg je zoiets a la de gallery van Tweakers.net.

Het is inderdaad mogelijk (ook handiger?) om de afbeeldingen gewoon los op te slaan, maar aangezien ik de functie BLOB tegenkwam, wou ik daar gebruik van maken. Daar is hij toch voor bedoeld, of niet?

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Plaatjes wel of niet in de DB is een heel andere discussie die hier al vaker gevoerd is. Uitkomst daarvan is dat voor beiden voor en nadelen gelden waardoor je niet ten alle tijde kunt zeggen dat de ene manier de foute is.

@TerraGuy:

Denk eens na. Het php bestand levert als het ware een jpg bestand op. Je kunt deze in de html gebruiken als jpg bestand. Hoe gebruik je normaal plaatjes in je code?

Stel je tweede stukje code staat in plaatje.php, dan zul je nog een pagina.php moeten maken waarin je iets doet als:
PHP:
1
<img src="plaatje.php?fotonr=<?=$fotonr?>"/>

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
RonnieB82 schreef op vrijdag 26 januari 2007 @ 13:29:
de fout die je krijgt, komt omdat je nogmaals je header probeert te schrijven, terwijl je al in de body van je html pagina zit.

header( "Content-type: image/jpg");
met dat commando roep je dus de header van de pagina aan, en niet je van je image.
Dat heb ik door. :) Maar hoe moet het dan wel, een image uit de database laten zien midden op een pagina?

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

PHP:
1
  echo "<img src=\"data:image/jpeg;base64,".$resultsfoto[Foto]."\" alt=\"bla\" />";

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

leuk, die voorbeelden met data-url's - ware het niet dat juist de meestgebruikte browser van vandaag daar niets mee aankan :P
Verder zit je dan ook met het feit dat een browser het niet kan cachen... (maar voor caching zal je ook in een output-script sowieso nog de juiste headers mee moeten geven).

Overigens kan je in een BLOB gewoon binaire data kwijt, er is dus geen reden om het met base64 te encoden en decoden. Wel moet je uiteraard escaping toepassen in je query ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Wim-Bart schreef op vrijdag 26 januari 2007 @ 13:34:
PHP:
1
  echo "<img src=\"data:image/jpeg;base64,".$resultsfoto[Foto]."\" alt=\"bla\" />";
Hee, thanks! Ik zat al wat te proberen met Johnny's voorstel, maar ik zal daar wel iets verkeerd opgevat hebben, deze werkt inderdaad!
Janoz schreef op vrijdag 26 januari 2007 @ 13:33:
Denk eens na. Het php bestand levert als het ware een jpg bestand op. Je kunt deze in de html gebruiken als jpg bestand. Hoe gebruik je normaal plaatjes in je code?

Stel je tweede stukje code staat in plaatje.php, dan zul je nog een pagina.php moeten maken waarin je iets doet als:
PHP:
1
<img src="plaatje.php?fotonr=<?=$fotonr?>"/>
Deze methode klinkt iets omslachtiger dan direct een image plaatsen. Heeft deze methode nog voordelen boven de 'snelle' methode of is het 'ook' een manier om het voor elkaar te krijgen?

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik zou zeggen, lees de post van Crisp. Het is niet 'ook' een manier op het voor elkaar te krijgen, het is 'de' manier om eht voor elkaar te krijgen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Hm, de data-url geeft inderdaad geen sjoege in IE; ik dacht dat het een PHP-functie betrof maar niet dus. :)

De <img src="plaatje.php?fotonr=<?=$fotonr?>"/>-methode is inderdaad de methode. Nu moet ik wel zeggen dat ik dat wel een zeer aparte methode vind. Ik had hem anders verwacht; meer in de lijn van die data-url, dat de datastroom uit de database met PHP omgezet zou worden naar een tijdelijk bestand die je dan kon afbeelden (zonder gebruik te maken van een extern bestand). Nu ik het weet ziet het er logisch uit. Maar ja, toen niet. :)

In ieder geval bedankt, het werkt nu en ik begrijp. ;)

[ Voor 4% gewijzigd door TerraGuy op 26-01-2007 20:00 ]

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
TerraGuy schreef op vrijdag 26 januari 2007 @ 19:59:
De <img src="plaatje.php?fotonr=<?=$fotonr?>"/>-methode is inderdaad de methode. Nu moet ik wel zeggen dat ik dat wel een zeer aparte methode vind. Ik had hem anders verwacht; meer in de lijn van die data-url, dat de datastroom uit de database met PHP omgezet zou worden naar een tijdelijk bestand die je dan kon afbeelden (zonder gebruik te maken van een extern bestand).
In een "ouderwets" statisch HTML bestand verwijs je toch ook naar een losse image? En da's dan ook heus een aparte/nieuwe/losse HTTP request hoor ;) Zo "apart" is het niet; sterker: het is gangbaar ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1