Bu konuyu anlamak için öncelikle daha önce yazmış olduğumuz php'de form konulu makaleyi okumalısınız.Okumadıysanız buradan okuyabilirsiniz.Dosya upload ettirirken belirli koşullarla bazı kısıtlamalar getirmemiz gerekiyor.Yoksa isteyen istediği kodu upload ederek sitemizi yönlendirebilir.Sistemimizde ciddi bir açık oluşabilir.
Upload Formu
Bunu form elemanlarından file form türünü seçerek yapacağız.form etiketine enctype değerine dosya upload edeceğimiz için “multipart/form-data” parametresini ekleyeceğiz.
Kod Çizelgesi Kod Dili: htmlHepsini Seç
<form action="gonder.php" method="post" enctype="multipart/form-data">
<input type="file" name="dosya" />
<input type="submit" value="Gönder" />
</form>
Bu formu kendi localhostunuzda deneyerek nasıl bir görüntüyle karşılaşacağınızı görebilirsiniz.Gönder butonuna basıldığında belirtilen dosya gönder.php adresine gönderilecektir.
Gönderilen Dosyaları Kontrol Etmek
Şimdi asıl olay başlıyor.Herkez dosya upload işlemini yukarıda verdiğim formu kullanarak yapabilir.Fakat o form da belirtilengönder.php adresine güvenlik bakımından çeşitli kısıtlamalar getirmezseniz başınız çok ağrıyabilir.İlk olarak gönder.php adresine bir dosya gönderilmişmi diye kontrol edeceğiz.Daha sonra bütün form elemanlarında olduğu gibi file formu türüde $_FILES global değişkeninden taşınmaktadır.Bizde gönder.php adresinde $_FILES değişkenini sorgulayarak gelen dosyanın özelliklerine bakıp ne olduğunu anlayacağız.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php if(isset($_FILES['dosya'])) {
echo 'Dosya gönderilmiş';
} else {
echo 'Lütfen bir dosya gönderin';
} ?>
Bu örnekte yanlızca sayfaya bir upload yapılmış mı diye kontrol ettik. Şimdi eğer dosya gönderilmişse boyutuna ve tipine bakma sırasında.
Bunlar için $_FILES global dizininin bizim dosyamız için ürettiği diğer alt dizin değerlerine bakacağız, bunları bir tabloda gösterelim.
İsim Açıklama
name Gönderilen dosyanın adı
type Gönderilen dosyanın tipi
tmp_ name Gönderilen dosyanın geçici olarak sunucuda barındığı adres.
size Gönderilen dosyanın bayt cinsinden boyutu
error Dosya gönderilirken gerçekleşen hata kodu
Yukarıdaki değerleri $_FILES global dizininde kendi dosya elementi adımızı girdikten sonra alt dizin şeklinde erişeceğiz.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php if(isset($_FILES['dosya'])){
$hata = $_FILES['dosya']['error'];
if($hata != 0) {
echo 'Yüklenirken bir hata gerçekleşmiş.';
} else {
$boyut = $_FILES['dosya']['size'];
if($boyut > (1024*1024*3)){
echo 'Dosya 3MB den büyük olamaz.';
} else {
$tip = $_FILES['dosya']['type'];
$isim = $_FILES['dosya']['name'];
$uzanti = explode('.', $isim);
$uzanti = $uzanti[count($uzanti)-1];
if($tip != 'image/jpeg' || $uzanti != 'jpg') {
echo 'Yanlızca JPG dosyaları gönderebilirsiniz.';
} else {
$dosya = $_FILES['dosya']['tmp_name'];
copy($dosya, 'dosyalar/' . $_FILES['dosya']['name']);
echo 'Dosyanız upload edildi!';
}
}
}
} ?>
Evet farkındayım çok uzun ve karışık görünen bir kod oldu ama koşulları yukarıdan aşağıya doğru incelerseniz aslında gayet düzenli bir şekilde kontrol ettik ve en sonunda tüm koşulları geçtiyse copy() fonksiyonu ile dosyayı geçici dizinden alıp dosyalar dizinine gönderdik.
Sırayla anlatayım. İlk olarak 1. satırda isset() fonksiyonu ile sayfaya gönderilme işlemi yapılıp yapılmadığına baktık.
2. ve 3. satırlarda gönderilen dosya bilgilerinden error değerine bakarak dosya gönderilmesinde herhangi bir hata meydana gelmiş mi diye kontrol ettik. Eğer error değeri 0 ise bir hata meydana gelmemiş demek olur. Bu hataların sebebi daha önceden de bahsettiğimiz gibi yazma izni gibi şeylerden ötürü kaynaklanabilir.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php
$hata = $_FILES['dosya']['error'];
if($hata != 0) {
echo 'Yüklenirken bir hata gerçekleşmiş.';
} else { // ... ?>
6. ve 7. satırlarda size değeri ile dosyanın boyutunu alıp (1024*1024*3) den büyük olup olmadığına baktık. Bu hesabın sonucu 3MB‘nin bayt cinsinden değerini verir. Eğer 3MB den büyük ise kabul etme demiş olduk.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php
$boyut = $_FILES['dosya']['size'];
if($boyut > (1024*1024*3)){
echo 'Dosya 3MB den büyük olamaz.';
} else { // ... ?>
10 – 15 satırları arasında dosyanın tipinin ne olduğuna ve dosyanın uzantısına baktık. Burada ben örnek olarak “image/jpeg” tipini ve jpg uzantısını kullandım, sen hangi dosyalara izin veriyorsan ona göre yanlızca uzantıları ya da tipleri kullanabilirsin. Örneğin $uzanti == ‘jpg’ || $uzanti == ‘gif’ || $uzanti == ‘png’ diyerek yanlızca bu üç uzantılı dosyaların alınmasını sağlayabilirsin.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php
$tip = $_FILES['dosya']['type']; $isim = $_FILES['dosya']['name']; $uzanti = explode('.', $uzanti); $uzanti = $uzanti[count($uzanti)-1];
if($tip != 'image/jpeg' || $uzanti != 'jpg') {
echo 'Yanlızca JPG dosyaları gönderebilirsiniz.';
} else { // ... ?>
Son olarak da dosya tüm koşulları geçtiğinde onu copy() fonksiyonu ile geçici dizinden 2. parametresine yazdığımız dosyalar klasörüne göndermiş olduk.
Kod Çizelgesi Kod Dili: phpHepsini Seç
<?php
$dosya = $_FILES['dosya']['tmp_name']; copy($dosya, 'dosyalar/' . $_FILES['dosya']['name']);
echo 'Dosyanız upload edildi!'; ?>
Bu derslikte bu kadar.Başka bir derste görüşmek üzere...