php dosya upload
PHP dosya yükleme işleme için önceki derslerde öğrendiğimiz html formunu kullanacağız. Başkalarının bilgisayarında olan dosyaları kendi sunucumuza göndereceğimiz bu çalışmada güvenlik için biraz dikkatli ve tedbirli olmamız gerekiyor.
Eğer hiç bir koşul uygulamadan saf bir upload uygulaması yapacak olursak, isteyen herkes sitemize istediği dosyayı ve yazılımı gönderebilir, kendi kodlarını atıp sitemizi ele geçirebilir.
Bunun için dosyaları enine boyuna kontrol edip onayladıktan sonra sitemize göndereceğiz. Öncelikle dosya uzantısına, dosya boyutuna ve dosyanın tipine bakacağız. Tipini ya da boyunu beğenmezsek almayacağız.
PHP upload formu hazırlama
Bunun için başta da dediğim gibi önceden anlattığımız html formunu kullanacağız. Ve bu formda gönderilecek dosyayı seçmemizi sağlayacak olan file form elementini yerleştireceğiz. Bir de form etiketine enctype değerine dosya upload edeceğimiz için “multipart/form-data” parametresini ekleyeceğiz.
<form action="gonder.php" method="post" enctype="multipart/form-data">
<input type="file" name="dosya" />
<input type="submit" value="Gönder" />
</form>
Bu formu tarayıcımızdan açtığımızda aşağıdaki gibi bir görüntü meydana gelmiş olacak. Ve gönder butonuna bastığımızda da dosyayı action parametresinde belirttiğimiz gonder.php sayfasına gönderecek.
Oluşturduğumuz bu form ile artık kullanıcılardan bize dosya transfer etme yolunu kurmuş olduk.
PHP’ye gönderilen dosyaları kontrol edip yüklemek
Şimdi gelelim dosyaların gönderileceği uygulamamıza, yani bizim örnekte gonder.php olarak adlandırdığımız sayfamıza.
İlk olarak sayfamıza bir dosya gönderilmiş mi diye kontrol edeceğiz. Eğer sayfaya direkt girmeye çalışılırsa hiç bir şey yapmamamız gerekiyor. Sonrasında $_FILES global değişkenini kullanarak bize gönderilen dosyanın boyutuna, tipine ve uzantılarına bakacağız.
Yine isset fonksiyonunu kullanarak bir dosya gönderilmiş mi diye bakacağız. Eğer gönderilmiş ise $_FILES global dizininde gönderilen dosya elementinin adında bir dizin oluşmuş olur. Yani form elementininin name parametresine yazdığımız isimimi kullanacağız. Biz formumuzu yaparken bu değere “dosya” yazmıştık.
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.
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.
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.
$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.
$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.
$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.
$dosya = $_FILES['dosya']['tmp_name'];
copy($dosya, 'dosyalar/' . $_FILES['dosya']['name']);
echo 'Dosyanız upload edildi!';