Buyuknet

Bilgisayar Dünyası => Webmaster => Konuyu başlatan: tarantula901 - 30.10.2008 - 10:56

Başlık: MySQL Veritabaninda Resim veya Normal Dosyalari Saklamak
Gönderen: tarantula901 - 30.10.2008 - 10:56
MySQL Veritabaninda Resim veya Normal Dosyalari Saklamak
Aslinda bu ise baslarken ugrasmak istedigim seyleri bir liste haline
getirdigimde kendim bile sasiyorum, bir bakmisim GTK+ içindeyim, olmamis
cookie'lerle, bogusup session degiskenleri ile yatip kalkiyorum :)

Eger PHP bu kadar genis olursa bende de bu kadar ögrenme istahi
olursa bu is devam eder, olsun halimden memnunum. Ilk olarak resim fikri, daha sonra
uygulamayi dusundügüm bir ögrenci bilgi sistemi programindan gelisti,
ogrencilerin resimlerini de veritabaninda tutup oradan okutmak, bu ise baslarken
ufak puf noktalarından bu kadar çekecegimi sanmiyordum ama oluyor iste,
ne de olsa PHP gelismis bir programlama dili ve gozunden bir şey kaçmiyor...


Islem basamaklarini yazarsak kisaca :

1- Resmi veritabanina kaydetme (resimekle.php)

2- Resmi secme (resimgoster.php)

3- Resmi ekranda gösterme (resimgetir.php)

1- Öncelikle resmi veritabanindan okuma islemleri için kisa bir seyler yazayim,
resimlerimizi asagida belirtilmis vt içinde saklayacacagimiz, verilmis vt
yapisina bakarsak çogu sey tanidik, belki longblob için biraz bilgi edinmek
lazim, blob(binary-large-object) çesitli bilgi çesitlerini tutabilen bir
tiptir. Deger olarak maximum 4294967295 (2^32 - 1) karakterdir. Blob'da da
Varchar'da oldugu gibi bir degisken kendisine atanan kisimda, girilen bilgi
kadar yer tutar. Yani 10 karakterlik bir tanimlama yapilip eger 4
karakterlik bir bilgi girilirse toplam alan 5 olacak(1 byte string ifade
uzunlugunu tutar). Blob'ta da benzer bir mantik vardir. Evet bu kadar bilgi
yeter.

"turkphp_veritabani" veritabani içindeki "resim" isimli tablonun yapisi :

id int,auto_increment,primary
aciklama varchar (50)
dosyaadi varchar(50)
boyut varchar(50)
resimdata longblob
dosyatip varchar(10)


Tablo icin SQL semasi :


CREATE TABLE resim (
id MEDIUMINT(5) DEFAULT '0' NOT NULL AUTO_INCREMENT,
aciklama VARCHAR(50),
dosyaadi VARCHAR(50),
boyut MEDIUMINT(8),
resimdata LONGBLOB,
dosyatip VARCHAR(10),
PRIMARY KEY (id)
);



Ilk önce yapacagimiz dosyalari makineden vt'ye aktarmak ,asagidaki form
yardimi ile yerel makineden seçilen bir dosyayi bir açiklama ile beraber
vt'ye kaydediyoruz. Kaydetme islemi ardindan her bir dosya için
mysql_insert_id komutu ile otomatik bir id numarasi saglaniyor resimlere.(Bu
komut, AUTO_INCREMENT kolon için sorgu sonrasi bir ID üretir.)

Burada birde form içindeki birkaç olaydan kisaca söz etmek
isterim,biliniyordur ama ben yinede söyleyeyim ki yazacak bir seyler olsun :
)
Form içinde gelen bilginin tür olarak(enctype) multipart/form-data seçilmis,
ve gizli parametre olarak dosya boyutu 2400000 byte olarak belirtilmis, daha
yukarisi dosyalar için ben bölümlemenizi tavsiye ederim, dosya çekme islemi
içinde <input type ="file" > tip olarak file seçildi. Böylece dosyayi "gözat "
butonu ile seçip form_data degiskenine aktarmis oluyoruz.






Resimekle.php

<?php
if ($submit)
{
mysql_connect("localhost","root","");
mysql_select_db("mesut");
$data = addslashes(fread(fopen($form_data, "rb"),filesize($form_data)));
$sonuc=mysql_query("INSERT INTO resim
(id,aciklama,dosyaadi,boyut,resimdata,dosyatip) ".
"VALUES
('null','$form_aciklama','$form_data_name','$form_data_size','$data','$form_data_type')");
$id= mysql_insert_id(); //otomatik ID verildi.
print "<p>Database ID No: $id";
mysql_close();
echo "<BR>n";
echo "Yuklediginiz resme bakabilir veya bilgisayariniza indirebilirsiniz... (http://www.turk-php.com/ornekler/mysql/resimgoster.php)";
echo "<BR>n";
echo "
Anasayfaya donebilirsiniz.... (http://www.turk-php.com/)";
}
else
{
print "<a href="$PHP_SELF">Ana Sayfa[/url]";
?>
<form method="post" action="<?php echo $PHP_SELF; ?>"
enctype="multipart/form-data">
Saklanacak dosya için açıklama:

<input type="text" name="form_aciklama" value="Yorum Yapilmamis..." size="40">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="10000">

 Database gonderilecek dosyayi secin: <input type="file"
name="form_data" size="40">


<BR>NOT : Bu demoda maximum dosya boyutu "10000" byte olarak ayarlanmistir... <BR>
<input type="submit" name="submit" value="Veritabanina EKLE">
</form>
<?php
}
?>


2- Simdide ekledigimiz resmi gösterelim. Vt içindeki tüm resimleri göstermek
veya belli bir resmi seçmek için çesitli yöntemler kullanabiliriz.Bir form
yardimi ile dosyaadi veya id degiskenlerini kullanabiliriz. Basitçe id si
veya dosyaadi girilen degisken vt'den sorgu ile çagrilip. Bir nesne olarak
fetch ediliyor,burada istenirse degerler array olarak da çekilebilir, bir
fark yok sanirim ama sadece kullanim farki var. (Array kullanimi : echo
$sira["dosyaadi"] , nesne kullanimi: echo $sira->dosyaadi (pointer gibi))
Burada resimleri localhost/resimgoster.php?id=2 seklinde id parametresini
göndererek resmi çagiriyoruz, eger kisi herhangi bir id yazmamissa tüm
resimleri gösteriyor.

Formu hazirlayalim...iste hazir asagida : )

resimgoster.php

<?
$i=0;
mysql_connect("localhost","root","") or die("server baglantisi
olmadi");
@mysql_select_db("mesut") or die("Veritabanı seçilemedi");
//eğer id kısmında bir değer yoksa tüm resimleri göster
if ($id==0 || $id==" ")
{
$sonuc=mysql_query("SELECT * FROM resim");
while($sira=mysql_fetch_object($sonuc))
{
$i++;
// burada resimgetir dosyasına id ile resim ekrana çıkartılıyor,dosyaadi ve
// açıklama ile beraber.
echo "<a href=\"resimgetir.php?id=$sira->id\"><IMG SRC=\"resimgetir.php?id=$sira->id\"></IMG>[/url]";
echo "--";
echo "Dosya adi : " . $sira->dosyaadi . "";
echo "--";
echo "Dosya açiklamasi: ". $sira->aciklama . "";
echo "<BR>";
}
echo "Toplam dosya sayisi:$i";
echo "<BR>";
exit();
}
//eger id kisminda bir deger varsa sadece olani göster
$sonuc=mysql_query("SELECT * FROM resim where id='$id' ") or die("Sorgu
calismadi");
if ($sonuc==NULL)
{
echo "Böyle bir resim yok..";
exit();
}
$sira=mysql_fetch_object($sonuc);
echo "<IMG SRC=\"resimgetir.php?id=$sira->id\">";
?>



3- Bunların ardindan gelelim en önemli kisma :) (finali en son yapalim
dedim). Burada hazirlayacagimiz dosya ile resimgoster'den gelen id'yi (tabi
bir id gelmişse) kullanarak vt'den uygun olan resmi, eger id gelmemisse tüm
resimleri gösterecek. Burada önemli nokta gösterilecek veri bir resim oldugu
için content-type için image/gif veya iamge/pjpeg seçilecek (ama herhangi
bir tanesi hepsi için çalisiyor :) )

resimgetir.php

<?php
Header("Content-type: Image/gif");// veya image/pjpeg
mysql_connect("localhost","root","") or die("server baglantisi
olmadi");
@mysql_select_db("mesut") or die("Veritabani Secilemedi");
$sonuc=mysql_query("SELECT * FROM resim WHERE id='$id' ") or die("Sorgu
çalistirilamadi");
$sira=mysql_fetch_object($sonuc);
echo $sira->resimdata;
?>

Bu olayi daha gelistirebiliriz. Örnegin resimleri bir combobox içine alip
oradanda seçildigi anda (onchange olayi) resmi göstermek gibi.Örnegin;

<FORM method="post" action="resimgetir1.php" name="gonder" >
<SELECT name="id" onchange="submit()">
<?
While($row=mysql_fetch_object($result))
{
?>
<option> <?echo $row->dosyaadi?></option>
<?
}
?>
</SELECT>
<INPUT TYPE="SUBMIT" name="gonder" value="GONDER">
</form>