Ayberk Atasay

ASP, CSS, Internet konuları üzerine paylaşımlar


PHP ile Dosyaları Veritabanında Saklamak

Önceki yazımda PHP ile form kullanarak nasıl upload yapabileceğinizi göstermiştim. Şimdi o konuyu bir adım ileriye taşımak istiyorum. Bu yazımda PHP ile formdan gelen dosyayı nasıl veritabanında saklarız sorusunun cevabını vereceğim.

Eğer önceki yazıyı okumuşsanız aşağıda vereceğim kodu zaten biliyorsunuz eğer okumadıysanız da çok önemli değil biraz inceleyerek çözebileceğinizi düşünüyorum.


if (isset($_FILES['dosya'])) //formdaki field ın adının dosya olduğunu varsaydım sizde farklıysa bu bölümü değiştirmeniz 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 başarılı";
}
else
{
die("Dosya yüklenemedi..");
}
}
}


Bu kodun öncesinde bir veritabanı bağlantısı yapmış olduğunuzu varsayarak devam edeceğim. Koddaki echo "Upload başarılı"; kısmını aşağıda vereceğim kodu ile değiştirerek dosyayı veritabanına yerleştireceğiz.

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

}
else
{
$dicerik = fread ($di, $boyut);
fclose ($di);
$encdosya=base64_encode($dicerik);
$sqldosya="INSERT INTO `tablo_adı` VALUES ('', '".$encdosya."')";
mysql_query($sqldosya);
unlink($name);
echo "Dosya başarıyla yüklendi"; //veya header("Location: panel.php"); gibi bir şey yapılabilir
}


Mantık gayet basit dosyayı fread fonksiyonu ile okuduktan sonra base64_encode ile metin olarak encode ediyoruz ve veritabanına giriyoruz. Dosyayı tekrar kullanmak istediğimizde ise veritabanından veriyi çekip base64_decode edeceğiz. MySQL de TEXT, MEDIUMTEXT veya LONGTEXT tipinde bir alanda saklama yapabilirsiniz bu tamamen maksimum dosya boyutunuza bağlı. Gerçek hayattan örnek vermek gerekirse download.php gibi bir uygulama yapmak isterseniz dosyanın mime-type dediğimiz dosya tipini ve dosya boyutu gibi bilgileri için de MySQL de alan oluşturup oralarda tutmanız gerekir ki tarayıcıyı dosyayı download etmeye zorlarken header olarak bilgileri gönderebilesiniz. Bu bilgileri göndermediğiniz takdirde tarayıcı dosyanın tipini ve dosya boyutunu bilemez ve dosya indirilirken 1.54 mb of unknown yani bilinmeyen dosya boyutunun 1.54 mb ı indirildi gibi hoş görünmeyen download pencereleri oluşur.

PHPÖzgün Sarı19 Haziran 2009, CumaEkle Bunu
Önceki Kayıt
Sonraki Kayıt
Yorumlar
y4
13 Temmuz 2010, Salı
güzel bilgi. teşekkürler paylaştığınız için.
Özgün SARI
28 Şubat 2010, Pazar
swordfish mantığı kapmışsınız gibi görünüyor önemli olan da bu idi zaten çalıştırmayı başarmış olmanız yeterli :)
swordfish
10 Şubat 2010, Çarşamba
veritabanina kayit yapan kod bende asagidaki sekilde calisti ..
benim isime yaradi birde siz bakin. bilginize..
' ---- Dosya Upload İşlemi Başlıyor... ---

if (isset($_FILES['dosya'])) //formdaki field ın adının dosya olduğunu varsaydım sizde farklıysa bu bölümü değiştirmeniz 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 başarılı";
' --------------------------------------veri tabanına yazılıyor..

' $uploaddir.$name, "rb" -- b sadece windows icindir.

$di = fopen ($uploaddir.$name, "rb");
if (!$di)
{
die("Dosya yüklenemedi..");

}
else
{

$fullpath = $uploaddir.$name;
$boyut = filesize($fullpath);
'
dosya uzaktan okunduğu 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 veritabanına yazılamadı.. ";
}
else{
unlink($fullpath);
echo "Dosya veritabanına başarıyla yüklendi"; //veya header("Location: panel.php"); gibi bir şey yapılabilir
}
}



' -------------------------veri tabanına yazıldı ----------------
}
else
{
die("Dosya yüklenemedi..");
}
}
}
Fatih
28 Ağustos 2009, Cuma
Paylaşım için teşekkürler
cep telefonu
27 Temmuz 2009, Pazartesi
teşekkürler.güzel bir çalışma ellerine saglok kolay gelsin
Yorum Yaz

İsim (*)

e-Posta (*) (Yayımlanmayacak)

URL




Resmi Değiştir
Güvenlik Kodu (Yukarıda gördüğünüz karakterleri yazınız)


Copyright © 2008 ayberk.com | Bu sitenin kodlaması ve teması Ayberk Atasay tarafından hazırlanmıştır. | XHTML 1.0