Php Dosya Yükleme Fonksiyonu

Php Dosya Yükleme Fonksiyonu

Php dosya yükleme fonksiyonu sunucuya form aracılığı ile dosya yüklemek için kullanacağımız fonksiyondur. Dosya yükleme hemen hemen her projede önümüze çıkacaktır. Php dosya yükleme işlemini uzun uzun her seferinde yazmak yerine fonksiyon tanımlayacağız ve böylece gereksiz tekrarı ve zaman kaybını önlemiş olacağız.

Dosya yükleme fonksiyonumuzu yazmaya başlamak için index.php isimli bir dosya oluşturuyorum ve içerisinde dosya yükleme formumu Bootstrap kütüphanesini kullanarak oluşturuyorum.

<?php include 'fonksiyon.php'; ?>
<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="boot/css/bootstrap.min.css"/>

    <title>Php Dosya Yükleme</title>
</head>
<body>
<div class="row">
    <div class="col-md-4 offset-md-4 mt-5">
        <h4>Php Dosya Yükleme</h4>
        <form action="" method="post" enctype="multipart/form-data">
            <div class="mb-3">
                <label class="form-label">Dosya Seçin</label>
                <input type="file" class="form-control" name="dosya">
            </div>
            <button type="submit" class="btn btn-primary">Yükle</button>
        </form>
    </div>
</div>
</body>
</html>
Php Dosya Yükleme Formu
Dosya yükleme formunun ekran görüntüsü

Yukarıda formumuzu oluşturduktan sonra artık fonksiyon.php isimli dosyamızı oluşturup fonsiyonumuzu yazıyoruz.

<?php
function dosya_yukle($dosya, $dosya_konumu = "./", $dosya_adi = null, $dosya_tipi = array(), $dosya_boyutu = null)
{
    /* Dosya tipi verileri dizi şeklindemi kontrol ettik ve değilse dizi olarak tanımladık */
    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;
    }
    /*Yüklemenin yapılacağı klasör yok ise oluşturuyoruz*/
    if (!file_exists($dosya_konumu)) {
        mkdir($dosya_konumu);
    }
    $dosya_konumu = rtrim($dosya_konumu, "/") . "/";
    /*Dosyayı karşıya yükleme */
    return move_uploaded_file($dosya["tmp_name"], $dosya_konumu . $dosya_adi);
}
?>

Yukarda beş adet parametre alan bir dosya yükleme fonksiyonu tanımladık. Bu parametreler yüklenecek dosya, dosyanın yükleneceği dizin, yüklenecek dosyanın yeni ismi, dosyanın uzantısı ve dosyanın boyutuu temsil ediyor.

Fonksiyonumuz içerisindeki kodları incelediğimizde sırası ile önce is_array fonksiyonunu kullanarak gönderilen dosya tipinin dizi şeklinde olup olmadığını kontrol ettik. Dizi şeklinde değil ise dizi olarak tanımladık.

Devamında yüklenecek dosyanın uzantısını izin verilen dosya uzantıları ile karşılaştırdım. Eğer izin verilen bir dosya uzantısı değilse hata mesajı döndürecektir.

Daha sonrasında dosya boyutunu kontrol ediyorum. Eğer dosya boyutu fonksiyona gönderilen boyuttan fazla ise tekrar hata mesajı döndürüyoruz.

Bir hata olmaması durumunda bu sefer yüklenecek dosya için fonksiyonumuza yeni bir isim gönderildiyse dosyayı yeni ismi ile eğer yeni isim gönderilmediyse mevcut ismi ile yüklenecek şekilde dosya adı değişkenimi tanımlıyorum.

Bir sonraki adımda ise dosyanın yükleneceği dizini ayarlıyoruz eğer yüklemenin yapılacağı klasör sunucuda yok ise yeni klasör oluşturuyoruz.

En son aşamada ise move_uploaded_file fonksiyonu ile dosyanın sunucuya yüklenmesi işlemini tamamlıyoruz.

Fonksiyonumuza nasıl dosya gönderip yükleyeceğimizi aşağıdan inceleyelim. Bu kod bloğunu </form> etiketinin hemen altına yazabilirsiniz.

<?php
if ($_FILES["dosya"]["name"]) {
    $dosya = $_FILES["dosya"];
    $maksimum_boyut = 1024 * 1024;
    $sonuc = dosya_yukle($dosya, "upload", '', 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>';
    }
}
?>

Alttaki kod parçacığında form ile dosya gönderilip gönderilmediğini kontrol ediyoruz.

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

Alttaki kod parçacığında formdan gönderilen dosyayı $_FILES süper global değişkeni ile yakaladık. Dosya ismini değişkene tanımladık. Sonrasında maksimum boyut isim değişken ile maksimum boyut 1 MB olacak şekilde tanımlama yaptım. Daha sonra fonksiyonumu çağırdım ve yukarıda bahsetmiş olduğum beş parametreyi fonksiyonuma gönderdim.

$dosya = $_FILES["dosya"];
$maksimum_boyut = 1024 * 1024;
$sonuc = dosya_yukle($dosya, "upload", '', array("image/png", "image/jpeg", "image/jpg"), $maksimum_boyut);

Dosya Yükleme Formu

<?php
include 'fonksiyon.php';
?>
<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="boot/css/bootstrap.min.css"/>

    <title>Php Dosya Yükleme</title>
</head>
<body>
<div class="row">
    <div class="col-md-4 offset-md-4 mt-5">
        <h4>Php Dosya Yükleme</h4>
        <form action="" method="post" enctype="multipart/form-data">
            <div class="mb-3">
                <label class="form-label">Dosya Seçin</label>
                <input type="file" class="form-control" name="dosya">
            </div>
            <button type="submit" class="btn btn-primary">Yükle</button>
        </form>
        <?php
        if ($_FILES["dosya"]["name"]) {
            $dosya = $_FILES["dosya"];
            $maksimum_boyut = 1024 * 1024;
            $sonuc = dosya_yukle($dosya, "upload", '', 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>';
            }
        }
        ?>
    </div>
</div>
</body>
</html>

Fonksiyonu her türden dosyayı istediğiniz şekilde yüklemek için kullanabilirsiniz. Aşağıda kısa kısa farklı kullanım şekillerini inceleyebilirsiniz.

<?php
/*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 : Dosya yüklerken isim parametresi göndermezseniz dosya mevcut ismi ile yüklenecektir. Hiç parametre gönderilmemesi durumunda hata verecektir bu nedenle boş göndermeniz gerekiyor.

Bir Cevap Yazın