Php Dosya Yükleme Fonksiyonu (Upload)

Php dosya yükleme fonksiyonu konusunda kendi fonksiyonumuzu oluşturarak basit ve kısıtlı php dosya yükleme fonksiyonu oluşturacağız. Php Fonksiyonlar konusunda fonksiyonların bizler açısından önemli rol oynadığından bahsetmiştik. Biz biliyoruz ki fonksiyonlar hem gereksiz tekrar engelliyor hem de kod yönetimini kolaylaştırıyor. Php Dosya Yükleme İşlemi konusunda php programlama dilinde dosyaların nasıl karşı sunucuya yükleneceğini anlattım. Bu yükleme işlemini biraz daha geliştirerek bir fonksiyon ile kullanımını anlatacağım.

Yükleme işlemi için kullanacağım formu Bootstrap 4.3.1 sürümünü kullanarak oluşturacağım. Verdiğim linkten indirmeyi unutmayın.

Yükleme işlemini gerçekleştireceğimiz fonksiyonumuzu yazmak için fonksiyon.php adında bir dosya oluşturalım. Bu dosyayı formumuzun olduğu dosyaya çağırarak kullanacağım.

<?php
function dosya_yukle($dosya, $dosya_konumu = "./", $dosya_adi = null, $dosya_tipi = array(), $dosya_boyutu = null)
{
    /* Dosya tipi dizimizin verileri dizi şeklindemi kontrol ettik. */
    if (!is_array($dosya_tipi)) {
        $dosya_tipi = array($dosya_tipi);
    }

    /* Dosya uzantılarını kontrol edelim. */
    if (!in_array($dosya["type"], $dosya_tipi) && count($dosya_tipi) > 0) {
        $uzantilar = implode(", ",$dosya_tipi);
        echo '
        <div class="alert alert-danger mt-2" role="alert">
        Sadece '.$uzantilar.' uzantılı dosyalar yüklenebilir.
        </div>
        ';
        return;
    }

    /* Dosya boyutunu kontrol edelim. */
    if ($dosya_boyutu != null && $dosya["size"] > $dosya_boyutu) {
        $mb_hesapla = $dosya_boyutu / 1024 / 1024;
        echo '
        <div class="alert alert-danger mt-2" role="alert">
        Dosya boyutu '.$mb_hesapla.' MB geçemez.
        </div>
        ';
        return;
    }

    /* Dosya ismini ayarlayalım. */
    if ($dosya_adi != null) {
        $dosya_adi = $dosya_adi . "." . pathinfo($dosya["name"], PATHINFO_EXTENSION);
    }

    /* Dosya konumunu ayarlayalım. */
    if ($dosya_adi == null) {
        $dosya_adi = $dosya["name"];
    } else {
        $dosya_adi = $dosya_adi;
    }
    $dosya_konumu = rtrim($dosya_konumu, "/") . "/";

    /*Dosyayı karşıya yükleme */
    return move_uploaded_file($dosya["tmp_name"], $dosya_konumu . $dosya_adi);
}
?>

Fonksiyonumuzu yukarıdaki gibi oluşturduk. Formumuzu oluşturmak için form.php dosyası oluşturalım ve dosyamızın başında fonksiyon.php dosyamızı dahil edelim.

<?php 
error_reporting(0);
include "fonksiyon.php"; 
?>

Ayrıcı error_reporting(0) komutu ile php uyarılarını gizleyelim. Bazı durumlarda php uyarıları görüntülenmektedir. Bu örnekte de uyarı göründüğü için onu gizlemeyi tercih ettim. Şimdi aşağıdaki HTML kodları ile Bootstrap 4.3.1 CSS kütüphanesini kullanarak formumuzu oluşturalım.

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Php Dosya Yükleme</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
    <h4>Php Dosya Yükleme</h4>
    <form action="" method="post" enctype="multipart/form-data">
        <div class="custom-file">
            <input type="file" class="custom-file-input" name="dosya">
            <label class="custom-file-label">Dosya Seçin</label>
        </div>
        <button type="submit" class="btn btn-primary mt-2">Yükle</button>
    </form>
</div>
</body>
</html>

Formumuzu oluşturduktan sonra dikkat etmemiz gereken önemli nokta file inputunun name parametresindeki değerdir. </form> kapanış etiketinin altına aşağıdaki php kodlarını yazalım.

<?php
if ($_FILES["dosya"]["name"]) {
    $dosya = $_FILES["dosya"];
    $maksimum_boyut = 1024 * 1024;
    $sonuc = dosya_yukle($dosya, "upload", "yeni_dosya_ismi", array("image/png", "image/jpeg", "image/jpg"), $maksimum_boyut);

    if ($sonuc) {
        echo '
         <div class="alert alert-success mt-2" role="alert">
         Dosya başarıyla yüklendi!
         </div>';
    } else {
        echo '
        <div class="alert alert-danger mt-2" role="alert">
        Dosya yüklenemedi!
        </div>';
    }
}
?>

Yukarıdaki kodumuzu parça parça aşağıda inceleyelim.

if ($_FILES["dosya"]["name"]) {

}

Bu karar yapısında bir dosya seçilip seçilmediğini kontrol ettik. Eğer bir dosya seçilmiş ise form aracılığı ile o dosyanın name değişkeni gönderileceği için name değişkeni üzerinden bir kontrol yaptım.

$dosya = $_FILES["dosya"];
$maksimum_boyut = 1024 * 1024;

Formdan gönderilen dosyayı $_FILES küresel değişkeni ile yakaladık ve dosya isimli değişkene aktardık. Maksimum boyut değişkeni ile 1MB’a denk gelecek işlemi yaptık. 

$sonuc = dosya_yukle($dosya, "upload", "yeni_dosya_ismi", array("image/png", "image/jpeg", "image/jpg"), $maksimum_boyut);

Fonksiyonumuzu çağırdık ve bütün parametreleri gönderdik. Fonksiyonumuzun çalışması için sadece dosya değişkenini göndermemizde yeterli ancak bütün parametreleri göndererek daha kısıtlı bir yükleme işlemi yapmamız mümkün.

Aşağıdaki kodları inceleyelim ve fonksiyonun diğer farklı kullanışlarını görelim. Yorum satırları ile açıklamayı kod arasına yaptım.

/*Hiç bir kısıtlama olmadan her türlü dosyayı yüklemek için kullanılır */
$sonuc = dosya_yukle($dosya);

/*Hiç bir kısıtlama olmadan her türlü dosyayı upload dizinine yüklemek için kullanılır */
$sonuc = dosya_yukle($dosya, 'upload');

/*Sadece PDF ve WORD dosyalarını upload dizinine yüklemek için kullanılır. */
$sonuc = dosya_yukle($dosya, 'upload', '', array('application/pdf','application/msword'));

Not: Fonksiyonda dizin olarak bir parametre gönderdiğinizde o dizini sunucuda oluşturmayı unutmayın.

Bu fonksiyonu 5 adet parametre alıyor. Parametrelerin hepsini doldurmanız gerekmediğini başta söylemiştim. Burada dikkat edilmesi gereken önemli nokta parametre sırasını karıştırmamanız.

Örneğin upload dizinine sadece PNG uzantılı dosyalar yüklemek istiyorsunuz ancak dosya ismi olduğu gibi kalacak. Bu durumda fonksiyona parametre gönderirken dosya isminin denk geldiği yeri boş göndermeniz gerekiyor. Eğer hiç bir parametre gönderilmez ise fonksiyon doğru çalışmayacaktır.

Hatalı Kullanım:

$sonuc = dosya_yukle($dosya, 'upload', array('image/png'));

Doğru Kullanım:

$sonuc = dosya_yukle($dosya, 'upload', '', array('image/png'));

Yukarıdaki iki kullanımı dikkatli incelediğimizde ‘upload’ ve array() arasında boş bir parametre gönderdim. Bu parametre fonksiyonda dosyanın yeni ismine karşılık geliyor. Bu parametre boş gönderilmediğinde dosya yükleme işlemi herhangi bir uzantı kısıtlaması olmadan gerçekleşiyor ve yeni yüklenen dosyanın adı Array oluyor. Bunun sebebi dosya tipi olarak gönderdiğimiz dizinin dosya adı parametresine denk gelmesidir.

Aşağıdaki iki .rar dosyasını yerel sunucuda aynı dizine çıkartın.

Çalışma dosyalarını indirmek için tıklayın.

Bootstrap 4.3.1 indirmek için tıklayın.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir