Bilgiler
  • Ekleyen:
  • Ozgun Sari
  • Tarih:
  • June 19, 2009
  • Kategori:
  • PHP
  • Paylas:
PHP ile Dosyalari Veritabaninda Saklamak

onceki yazimda PHP ile form kullanarak nasil upload yapabileceginizi gostermistim. Simdi o konuyu bir adim ileriye tasimak istiyorum. Bu yazimda PHP ile formdan gelen dosyayi nasil veritabaninda saklariz sorusunun cevabini verecegim.

Eger onceki yaziyi okumussaniz asagida verecegim kodu zaten biliyorsunuz eger okumadiysaniz da cok onemli degil biraz inceleyerek cozebileceginizi dusunuyorum.

if (isset($_FILES['dosya'])) //formdaki field in adinin dosya oldugunu varsaydim sizde farkliysa bu bolumu degistirmeniz gerekebilir.
{
$file = $_FILES['dosya'];
if ($file['error'] == UPLOAD_ERR_OK)
{
$name = md5(uniqid(mt_rand().time(),true));
$pathInfo = pathinfo($file['name']);
if (isset($pathInfo['extension']))
$name .= '.'.$pathInfo['extension'];
$uploaddir="./temp/";
if (move_uploaded_file($file['tmp_name'], $uploaddir.$name))
{
echo "Upload basarili";
}
else
{
die("Dosya yuklenemedi..");
}
}
}


Bu kodun oncesinde bir veritabani baglantisi yapmis oldugunuzu varsayarak devam edecegim. Koddaki echo "Upload basarili"; kismini asagida verecegim kodu ile degistirerek dosyayi veritabanina yerlestirecegiz.

$di = fopen ($uploaddir.$name, "r");
if (!$di)
{
die("Dosya yuklenemedi..");

}
else
{
$dicerik = fread ($di, $boyut);
fclose ($di);
$encdosya=base64_encode($dicerik);
$sqldosya="INSERT INTO `tablo_adi` VALUES ('', '".$encdosya."')";
mysql_query($sqldosya);
unlink($name);
echo "Dosya basariyla yuklendi"; //veya header("Location: panel.php"); gibi bir sey yapilabilir
}


Mantik gayet basit dosyayi fread fonksiyonu ile okuduktan sonra base64_encode ile metin olarak encode ediyoruz ve veritabanina giriyoruz. Dosyayi tekrar kullanmak istedigimizde ise veritabanindan veriyi cekip base64_decode edecegiz. MySQL de TEXT, MEDIUMTEXT veya LONGTEXT tipinde bir alanda saklama yapabilirsiniz bu tamamen maksimum dosya boyutunuza bagli. Gercek hayattan ornek vermek gerekirse download.php gibi bir uygulama yapmak isterseniz dosyanin mime-type dedigimiz dosya tipini ve dosya boyutu gibi bilgileri icin de MySQL de alan olusturup oralarda tutmaniz gerekir ki tarayiciyi dosyayi download etmeye zorlarken header olarak bilgileri gonderebilesiniz. Bu bilgileri gondermediginiz takdirde tarayici dosyanin tipini ve dosya boyutunu bilemez ve dosya indirilirken 1.54 mb of unknown yani bilinmeyen dosya boyutunun 1.54 mb i indirildi gibi hos gorunmeyen download pencereleri olusur.
Yorumlar
  • Eski Yorumlar:
  • cep telefonu
  • tesekkurler.guzel bir calisma ellerine saglok kolay gelsin
  • 2009-07-27 13:02:40
  • Fatih
  • Paylasim icin tesekkurler
  • 2009-08-28 16:44:39
  • swordfish
  • veritabanina kayit yapan kod bende asagidaki sekilde calisti .. benim isime yaradi birde siz bakin. bilginize.. /* ---- Dosya Upload Islemi Basliyor... --- */ if (isset($_FILES['dosya'])) //formdaki field in adinin dosya oldugunu varsaydim sizde farkliysa bu bolumu degistirmeniz gerekebilir. { $file = $_FILES['dosya']; $orjifile = $file['name']; if ($file['error'] == UPLOAD_ERR_OK) { $name = md5(uniqid(mt_rand().time(),true)); $pathInfo = pathinfo($file['name']); if (isset($pathInfo['extension'])) $name .= '.'.$pathInfo['extension']; $uploaddir="./temp/"; if (move_uploaded_file($file['tmp_name'], $uploaddir.$name)) { echo "Upload basarili"; /* --------------------------------------veri tabanina yaziliyor.. */ /* $uploaddir.$name, "rb" -- b sadece windows icindir. */ $di = fopen ($uploaddir.$name, "rb"); if (!$di) { die("Dosya yuklenemedi.."); } else { $fullpath = $uploaddir.$name; $boyut = filesize($fullpath); /* dosya uzaktan okundugu icin bunlar calismiyor.. $dicerik = fread($fullpath,$boyut); $dicerik = addslashes($dicerik);*/ $dicerik = file_get_contents ($fullpath); /*uzaktan stream sekilde aliniyor.. slashlar fullpath deil. / olduu icin boyle.*/ fclose ($di); $encdosya=base64_encode($dicerik); $sqldosya = "INSERT INTO dosya (`dkno`,`.....$orjifile')"; $sqlsonuc = mysql_query($sqldosya); if (!$sqlsonuc){ echo " Dosya veritabanina yazilamadi.. "; } else{ unlink($fullpath); echo "Dosya veritabanina basariyla yuklendi"; //veya header("Location: panel.php"); gibi bir sey yapilabilir } } /* -------------------------veri tabanina yazildi ---------------- */ } else { die("Dosya yuklenemedi.."); } } }
  • 2010-02-10 00:15:04
  • Ozgun SARI
  • swordfish mantigi kapmissiniz gibi gorunuyor onemli olan da bu idi zaten calistirmayi basarmis olmaniz yeterli :)
  • 2010-02-28 12:45:36
  • y4
  • guzel bilgi. tesekkurler paylastiginiz icin.
  • 2010-07-13 21:30:24
  • MyBB
  • Tesekkurler,anlatim cok guzel olmus,eminim bir cok kisinin isine yaricaktir..
  • 2010-07-25 14:08:29