Hantera BLOB -lagrade bilder

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Emerald



Medlem i: 4980 dagar

Status: Offline



#742580
Inlägg Skrivet: 2019-05-25 21:26      Ämne: Hantera BLOB -lagrade bilder Citera

Har stött på hinder med bilder som lagras i en databas. Bilderna lagras i en BLOB-kolumn och är i blandade filformat - jpg/jpeg, gif och png. Har försökt att läsa på ämnet utan att bli klokare.

Frågan är alltså hur jag hämtar in data och presenterar bilden? Övriga kolumner hämtar jag med PDO > fetchAll > fetch_assoc. Bör ju gå att baka in i det anropet.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4840 dagar
Från: Tavesta
Status: Offline



#742581
Inlägg Skrivet: 2019-05-25 23:33      Ämne: Citera

Det går bra att hämta bildens data på samma sätt som du hämtar annat data från databasen.
I normalfallet så hämtas bilden från webbservern i en separat http-förfrågan, och det php-skript som hanterar den behöver där bara hämta bilddatat, och inget av det övriga datat.
Det går förvisso också att bädda in bilden direkt i html-koden, i en sk data-url. Den kan ta ganska mycket plats i html-koden, så det brukar oftast bara vara en bra lösning för små bilder.

Sedan behöver du ta reda på vad bilden har för bildtyp. Finns inte det sparat i något fält i databasen behöver du fiska fram det ur själva bilddatat.
Om bilden levereras i en separat http-förfrågan så får du skicka en content-type-header som anger bildtyp och om du använder data-url så skall bildtypen vara med som en del av den.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Emerald



Medlem i: 4980 dagar

Status: Offline



#742582
Inlägg Skrivet: 2019-05-26 01:57      Ämne: Citera

Tack Harald, du är alltid toppen här! Har suttit med det här i ett par timmar till nu och försökt att läsa på. Är helt klart utanför min "comfort zone" nu, men det är ju så man lär sig. Så här långt har jag kommit nu:

PHP:
1:
 $rq "SELECT design_image FROM designs WHERE id=:id";
2:
$query $conn->prepare($rq);
3:
$query->execute(array(':id' => $image_id));
4:
$query->bindColumn(1$imagePDO::PARAM_LOB);
5:
$query->fetch(PDO::FETCH_BOUND);
6:
header("Content-Type: image/jpg"); 


Då ger $image "... cannot be displayed because it contains errors", vilket jag vill minnas kan bero på något fel när headern sätts. Har du någon knuff i rätt riktning att ge?

Vidare så kommer jag att behöva kolla upp filtypen då det inte framgår av databasen. För just den här bilden som jag testar med nu så vet jag att det är en jpg.

Klurar dock lite på om inte det blir väldigt ineffektivt att behöva söka upp informationen ur varje bild? Det rör sig om 20-30 bilder på en sida som ska laddas på det här sättet och det känns spontant som att det kan bli ganska segladdat. Bör jag överväga någon bättre lösning?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4840 dagar
Från: Tavesta
Status: Offline



#742584
Inlägg Skrivet: 2019-05-26 12:27      Ämne: Citera

Vanligaste orsakerna till felet du får är:
- Något annat utöver bilddatat matas ut. Använd aldrig ?>. Kolla om utmatat data innehåller felmeddelanden. Dessa ser du enkelt om du t.ex sätter content-type till text/plain.
- Just den här bilden är inte i jpeg-format.
- Datat som som lagras i databasen har tidigare bearbetats på något felaktigt sätt, så det blivit korrupt.

Content-type för jpeg-bilder skall för övrigt vara image/jpeg, men jag misstänker att din webbläsare även svalde den du angav, med tanke på det felmeddelande du fick.

Ett alternativt sätt att spara bilderna är spara dem i en mapp, där filnamnet bygger på det id de annars skulle haft i databasen. Problemet med att hitta rätt filtyp kvarstår dock.
Men finns det bara ett fåtal filtyper så kan man kanske använda file_exists för att testa vilka filnamnändelser som det finns bildfil med.

Databaslagring av bilder brukar ofta inte anses som det effektivaste sättet att hantera bilder. Exakt vad det innebär i prestanda har jag dock aldrig testat.
Nackdelen med att lagra bilder som egna filer är att filuppladdningen är en känsligare operation ur säkerhetssynpunkt, jämfört med att lagra bilddatet i databasen.
Men gör man rätt så uppstår inga risker.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic