«« ( Date ) »» // «« ( Thread ) »» // ri4st - 2003

Re: Slike u Mysql

by Stevan Koprivica
četvrtak, 26. jun 2003 - 00:39.


Ux krajnje sporna argumentacija oko komercijalnih servera.... Ako nadjete ovakav kakav je sinisa opisao - promenite provajdera. Posto mislim da je to ipak tesko naci (a videh svakojakih gluposti na tu temu) - mali tip za *nix servere (na kojima prakticno jedino i ima smisla terati php / mysql kombinaciju) - mozete i iz ftp klijenta (ako nemate shell nalog) dati svom root web folderu (ili kom vec) 777 privilegije, a zatim iz php-a napraviti folder u koji nameravate da smestate slike (npr. <?php mkdir("myimages", 0755); ?>) i zatim vratiti root folder na 755, time dobijate folder "myimages" ciji je vlasnik user pod kojim se izvrsava PHP skript (obicno nobody) i po kome mozete slobodno pisati iz svojih PHP skriptova (i brisati i praviti podfoldere i sta god).

Posto dobih i pitanje na temu kako se radi sa BLOB poljima - isto kao i sa obicnim TEXT / VARCHAR poljima, sustinske razlike blob / text po pitanju smestanja slika nema - pogledati MySQL manual, sekcija String Types / The BLOB and TEXT Types.

Smestanje same slike u BLOB polje je poprilicno jednostavno (opet, savet je ako ne mora, da se to ne radi - performace issue) - ukoliko ocekujete da korisnik uploaduje sliku koju smestate u bazu, pogledajte prvo PHP manual, Handling file uploads (chapter 18). Tako dolazimo na sledeci korak - fajl sa slikom imamo negde na disku, smestamo sliku u neki string (pogledati PHP manual, funkcija fread - ima i primer kako se ceo fajl cita u neki bafer) i zatim SQL komandom smestamo u nasu bazu

<?php
$query = "INSERT INTO blabla SET imagedata = '$buffer'";
mysql_query($query, $conn);
?>

Za svaki slucaj bi valjalo i iskoristiti mysql_escape_string() funkciju na $buffer... ili ako zelite bas da ste sigurni - base64_encode().

<?php
$query = "INSERT INTO blabla SET imagedata = '" . mysql_escape_string($buffer) . "'";
mysql_query($query, $conn);
?>

Jasno je da se na slikama od npr. 2 MB ovako potrosi 2 MB na bafer i jos 2 MB na SQL string i da smo jako blizu da udarimo u memorijsko ogranicenje PHP skripta koje je obicno ograniceno na 8 MB (i ne zaboravite da sam PHP engine moze da uzme i pola od toga za svoje potrebe ukoliko pravite ne-jednostavne skriptove), te samim tim ovaj pristup nikako nije pogodan za ovaj slucaj...

Sto se zagusenja tice - pre bih rekao opterecenje, a i zasto biste radili posao web (Apache) servera...

I jos jedan tip za kraj - za ispis ovako smestenih slika, pogledajte PHP manual - Image functions, a kod bi otprilike isao ovako...

<image src="showimage.php?id=10">

-----

<?php
$conn = mysql_connect(...);
mysql_select_db(...);

$query = "SELECT ... FROM blabla WHERE id = " . $_GET['id'];
$row = mysql_fetch_object(mysql_query($query, $conn)):
if ($row->imagedata) {
header ("Content-type: image/jpeg");
echo $row->imagedata;
}
?>



Варијанта са BLOB пољима је прихватљива само када слике мораш меморисати у ситуацији у којој немаш привилегије да их снимаш у фолдере (нпр. у скриптама које се извршавају на комерцијалном провајдерима)!
Поздрав,
Синиша
----- Original Message -----
From: "Stevan Koprivica" <<mailto:ctebah@sezampro.yu>ctebah@sezampro.yu>
To: <<mailto:ri4st@titan.etf.bg.ac.yu>ri4st@titan.etf.bg.ac.yu>
Sent: Sunday, June 22, 2003 4:17 AM
Subject: Re: [ri4st] Slike u Mysql

>
> >Da li neko zna da li moze i na koji nacin se stavljaju slike u Mysql
> >(konkretno u onu bazi iz trijada koju je vecina nas koristila za projekat)
>
> u polje tipa blob (ili neko srodno mediumblob...), mada ne preporucujem
> takav pristup.
>
> Pozdrav,
> Stevan
>
> -----------------------------------------------------------------
> unsubscribe:
> <mailto:minimalist@titan.etf.bg.ac.yu?subject=unsubscribe%20ri4st>minimalist@titan.etf.bg.ac.yu?subject=unsubscribe%20ri4st
> -----------------------------------------------------------------
>