UYARI: İnternet bir özgürlük ortamı, evet fakat her site gibi bu site de yayınına devam edebilmesi için reklam almak zorunda, ama büyük ihtimalle siz de reklam görmekten sıkıldığınız için AdBlock veya benzeri bir programı kurdunuz. Bu durum anlaşılır bir durum birçok kişi bunu yapıyor, fakat bu yapıldığı zaman da siteler masraflarını karşılayamadıkları için kapanmak zorunda kalıyor. Sitemiz AdBlock kullanan birini "Sen siteye girme" kardeşim diye engellemiyor çünkü özgürlük bunu gerektiriyor, siteyi seven zaten AdBlock'u kapatıp desteğini gösterir buna gerek yok, bu yüzden sitede özgürce dolaşacak sadece her dolaştığınız sayfalarda bu uyarı bulunacaktır....
Logo
mobilmenu
RenkliKodlar
PHP ile dosya yükleme upload
Bu yazımda PHP ile dosya yükleme upload işlemini detaylarıyla incelemeye alıyorum.
Uzun süre yazı yazamadım android geliştirmelerim sürekli değişen andorid kodlarını güncelemekten pek fırsat kalmıyor.

PHP ile dosyaları sunucuya yüklemek kolaydır.

Ancak, kolaylıklar tehlike de getirir, bu nedenle dosya yüklemelerine izin verirken her zaman dikkatli olmamız gerekir!

"Php.ini" Dosyasını Yapılandırın


Öncelikle, PHP'nin dosya yüklemelerine izin verecek şekilde yapılandırıldığından emin olun bunu host sunucusundan aktif olup olmadığını aşağıdaki kod ile öğrenebilirsiniz.
<?php echo ini_get('file_uploads'); ?>

Host dosyalarına erişiminiz varsa veya localde bu işlem için "Php.ini" dosyanızda, file_uploads yönergesini arayın ve "on" olarak ayarlayın
file_uploads = On

Bir HTML Formu Oluşturalım


Ardından, kullanıcıların yüklemek istedikleri dosyaları seçmelerine olanak tanıyan bir HTML formu oluşturalım.
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
  <input type="file" name="file[]"><br>
  <input type="file" name="file[]"><br>
  <input type="file" name="file[]"><br><br>
  <input type="submit" value="Yükle" name="submit">
</form>
</body>
</html>Kopyala

Bu HTML formu için uyulması gereken bazı kurallar:

Formda method = "post" kullandığından emin olun
Form ayrıca şu özniteliğe de ihtiyaç duyar: enctype="multipart/form-data". Formu gönderirken hangi içerik türünün kullanılacağını belirtir
Yukarıdaki gereksinimler olmadan dosya yükleme çalışmaz.

Dikkat edilmesi gereken diğer şeyler:

<input> etiketinin type="file" özniteliği, giriş alanını bir dosya seçme kontrolü olarak gösterir ve giriş kontrolünün yanında bir "Gözat" düğmesi bulunur
Yukarıdaki form, verileri daha sonra oluşturacağımız "upload.php" adlı bir dosyaya gönderir.

<input> etiketinin name="file" özniteliği, burada file devamındaki köşeli tırnak karakterleri çoklu dosya yükleme olanağı sağlar yukarıdaki formda 3 dosya yüklenebilir, yazının devamında php kodları çoklu yüklemeye göre yazılmıştır tek veya daha fazla dosya yüklemek için <input type="file" name="file"> etiketlerini çoğaltın veya azaltın ancak name="file" özniteliğinde file devamındaki köşeli tırnak karakterleri aynen kalmalıdır bu sayede tek dosya da yüklenecektir.

<input> etiketinin name="MAX_FILE_SIZE" özniteliği, pek gerekli değildir ancak kullanılırsa upload.php dosyasından hata ayıklamamıza olanak sağlar "Php.ini" dosyasındaki varsayılan ayardan fazlasını kullanamazsınız echo ini_get('post_max_size'); ile kontrol edilebilir.

Yükleme için "upload.php" Dosyasını Oluşturalım



Gerekli olan değişkenler açıklamaları kodlarda olduğu için detaylara girmiyorum.
$klasor = "upload/"; // dosyaların yükleneceği klasör.
$max_boyut = 1048576; // byte olarak izin verilen dosya boyutu (1024 = 1 KB) (1048576 = 1 MB) (1073741824 = 1 GB) (1099511627776 = 1 TB)
$dosya_adini_koru = false; // (false) 15 haneli random karakter adında kaydeder

// Kabul gören dosya formatları.
$kabul_goren = array(
   'jpg' => 'image/jpeg',
   'png' => 'image/png',
   'gif' => 'image/gif',
   'mp4' => 'video/mp4',
);Kopyala

Hata ayıklamayı kolaştırmak için RuntimeException (Çalışma zamanı istisnası) oluşturarak upload kodlarını yazıyoruz.
try {
   // upload kodları buraya yazılacak
} catch (RuntimeException $e) {
  echo $e->getMessage();
}Kopyala

Önce formdan gelen name="file" özniteliklerini alıyoruz
$files = @$_FILES['file'];Kopyala

Ajax ile post edildiğinde dosya seçilmeden form post edilirse foreach hataya düşecektir onun için foreach öncesi $files durumunu kontrol ediyoruz.
if (!$files) {
  throw new RuntimeException('Dosya seçilmedi');
}Kopyala

foreach döngüsünü kurup dosyaları yüklüyoruz
foreach ($files['name'] as $i => $file) {
  if (move_uploaded_file($files['tmp_name'][$i], $klasor . basename($files['name'][$i])) {
    echo basename($files['name'][$i] . ' Yüklendi.<br>';
  }
}Kopyala

Basit şekli ile bu kodlarla dosya yüklemesi yapabiliriz ancak bu çok basit ve güvensiz olacaktır bu şekilde kötü niyetli kişiler zararlı dosya yükleyebilir, izin vermek istemediğimiz büyüklükte veya formatta dosya yükleyebilir veya dosya adları başka bir dosya ile çakışabilir bunun gibi durumları kontrol ederek daha güvenli hale getirmemiz gerekir.

Basit şeklini geliştirelim ve for döngüsü içinde hata ayıklamaya başlayalım


Formdan geçersiz parametreler gelebilir genellikle <input> etiketinin name="file" özniteliğindeki file devamındaki köşeli tırnak karakterleri unuturuz v.s
if (!isset($files['error'][$i]) || is_array($files['error'][$i])) {
  throw new RuntimeException('Geçersiz parametreler.');
}Kopyala

PHP varsayılan olarak hali hazırda bazı hata ayıklama iletileri sunar bunlardan faydalanıyoruz
switch ($files['error'][$i]) {
   case UPLOAD_ERR_OK:
      //Değeri: 0; Hata yoktur, dosya yükleme başarılıdır.
	  break;
   case UPLOAD_ERR_NO_FILE:
      throw new RuntimeException('Dosya gönderilmedi.');
   case UPLOAD_ERR_INI_SIZE:
      throw new RuntimeException('Yüklenen dosya php.ini içindeki upload_max_filesize değerini aşmakta.');
   case UPLOAD_ERR_FORM_SIZE:
      throw new RuntimeException('Yüklenen dosya, HTML formunda belirtilen MAX_FILE_SIZE direktifini aşıyor.');
   case UPLOAD_ERR_CANT_WRITE:
      throw new RuntimeException('Dosya diske yazılamadı.');
      break;
   default:
      throw new RuntimeException('Bilinmeyen yükleme hatası.');
}Kopyala
Birçok upload örneği dosya uzantısını kullanarak izin verilen dosya kontrolleri yapar oysa bu pek güvenli değildir dosya uzantı kontrolü kötü niyetli kişiler tarafından aşılabilir daha güvenli olması için MIME türü kontrölü yapılmalıdır PHP 5.3.0'dan beri MIME türü kullanılabilir zaten daha eski bir sürümü günümüzde kullanan pekte yok.

Dosya türü kontrolü için upload.php dosya oluştururken oluşturduğumuz $kabul_goren dizisindeki kabul edilen MIME türlerine bakıyoruz.
$finfo = new finfo(FILEINFO_MIME_TYPE);
$ext = array_search($finfo->file($files['tmp_name'][$i]), $kabul_goren, true);
if (false === $ext) {
  throw new RuntimeException('Geçersiz dosya formatı.');
}Kopyala

Gerekli olan değişkenleri upload.php dosya oluştururken kullanmıştık ya $dosya_adini_koru = false; durumunu kontrol edip gerekirse dosya adını yükleme sırasında değiştiriyoruz, burada değişim olacaksa rastgele bir sayıyı md5 algoritması ile benzersiz bir isme dönüştürerek bunun 15 haneli bir kısmını kullanıyoruz.
if (!$dosya_adini_koru) {
  $ilk_ad = $files['name'][$i];
  $uzanti = '.' . strtolower(pathinfo($ilk_ad,PATHINFO_EXTENSION));
  $rnd = substr(uniqid(md5(rand())), 0,15); // 15 haneli random karakter
  $yeni_adi = basename($rnd . $uzanti);
} else {
  $yeni_adi = basename($files['name'][$i]);
}Kopyala

Bazen yüklemeye çalıştığımız dosya ile aynı ada sahip başka bir dosya bulunabilir kontrol etmez isek yeni dosya bu dosyanın üzerine yazılır bu bizim istemediğimniz bir durum, kontrol için file_exists ile bu dosya adında bir dosya var olup olmadığını araştırıyoruz varsa uyarı mesajı yazdırıyoruz.
if (file_exists($klasor . $yeni_adi)) {
  throw new RuntimeException($yeni_adi . ' adında bir dosya daha önce yüklenmiş (yeniden adlandır).');
}Kopyala

Her boyuttaki dosyaya izin veremeyiz ancak "Php.ini" ayarlarında belirtilmiş olan upload_max_filesize değerini de aşmamamız gerekir echo ini_get('upload_max_filesize'); ile gerçek değeri öğrenebilirsiniz, ini_get('post_max_size') ile bir formdan gönderilecek dosya boyutu sınırını da ele almalısınız.

Aşağıdaki kontrol sadece "Php.ini" izin verilen değerlerin altında bir sınırlama için geçerlidir
if ($files['size'][$i] > $max_boyut) {
  throw new RuntimeException('Dosya boyutu sınırı aşıldı.');
}Kopyala

Artık tüm denetimleri yaptığımıza göre dosyamızı güvenli bir şekilde karşıya yükleyebiliriz.
if (move_uploaded_file($files['tmp_name'][$i], $klasor . $yeni_adi)) {
  echo $yeni_adi . ' Yüklendi.<br>';
}Kopyala

Ve son olarak upload.php dosyasının tamamı.
<?php
$klasor = "upload/"; // dosyaların yükleneceği klasör.
$max_boyut = 1048576; // byte olarak izin verilen dosya boyutu (1024 = 1 KB) (1048576 = 1 MB) (1073741824 = 1 GB) (1099511627776 = 1 TB)
$dosya_adini_koru = false; // (false) 15 haneli random karakter adında kaydeder
// Kabul gören dosya formatları.
$kabul_goren = array(
    'jpg' => 'image/jpeg',
    'png' => 'image/png',
    'gif' => 'image/gif',
    'mp4' => 'video/mp4',
);

/// upload kodları
try {

$files = @$_FILES['file'];

if (!$files) {
    throw new RuntimeException('Dosya seçilmedi');
}

foreach ($files['name'] as $i => $file) {

    if (!isset($files['error'][$i]) || is_array($files['error'][$i])) {

        throw new RuntimeException('Geçersiz parametreler.');
    }

    switch ($files['error'][$i]) {
        case UPLOAD_ERR_OK:
            //Değeri: 0; Hata yoktur, dosya yükleme başarılıdır.
            break;
        case UPLOAD_ERR_NO_FILE:
            throw new RuntimeException('Dosya gönderilmedi.');
        case UPLOAD_ERR_INI_SIZE:
            throw new RuntimeException('Yüklenen dosya php.ini içindeki upload_max_filesize değerini aşmakta.');
        case UPLOAD_ERR_FORM_SIZE:
            throw new RuntimeException('Yüklenen dosya, HTML formunda belirtilen MAX_FILE_SIZE direktifini aşıyor.');
        case UPLOAD_ERR_CANT_WRITE:
            throw new RuntimeException('Dosya diske yazılamadı.');
            break;
        default:
            throw new RuntimeException('Bilinmeyen yükleme hatası.');
    }
    
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $ext = array_search($finfo->file($files['tmp_name'][$i]), $kabul_goren, true);
    if (false === $ext) {
        throw new RuntimeException('Geçersiz dosya formatı.');
    }
    
    if (!$dosya_adini_koru) {
        $ilk_ad = $files['name'][$i];
        $uzanti = '.' . strtolower(pathinfo($ilk_ad,PATHINFO_EXTENSION));
        $rnd = substr(uniqid(md5(rand())), 0,15); // 15 haneli random karakter
        $yeni_adi = basename($rnd . $uzanti);
    } else {
        $yeni_adi = basename($files['name'][$i]);
    }
    
    if (file_exists($klasor . $yeni_adi)) {
        throw new RuntimeException($yeni_adi . ' adında bir dosya daha önce yüklenmiş (yeniden adlandır).');
    }
        
    if ($files['size'][$i] > $max_boyut) {
        throw new RuntimeException('Dosya boyutu sınırı aşıldı.');
    }
    
    if (move_uploaded_file($files['tmp_name'][$i], $klasor . $yeni_adi)) {
        echo $yeni_adi . ' Yüklendi.<br>';
    }


}


} catch (RuntimeException $e) {
    echo $e->getMessage();
}?>Kopyala


Evet dosya yükleme işlemi bu kadar, diğer bir yazı bu upload kodlarını kullanarak bir progress bar (Yükleme ilerlemesi) nasıl kullanırız bilmek isterseniz Buradaki örneği inceleyebilirsiniz.
Şimdilik esenlikler diliyorum.


PHP ile dosya yükleme upload Yorumları:


Bu yazıya toplam 1 yorum yapılmış.
Toplam 1 sayfa yorum var, Gösterimde olan yorum sayfası 1
16 Şubat 2024, 10:44
osman yazdı:
gayet açıklayıcı bilgilendirme.teşekkürler
  • 1



Bağlan

Yorumunuza cevap yazilmasi durumunda bildiri almak istiyor musunuz?