PHP Üzerinde Dosya Sıkıştırma

PHP Üzerinde Dosya Sıkıştırma

Hepinize merhaba dostlarım yine ben 😊. Artık klasik cümlemi kurmaktan bu yazımda kaçındım çünkü hepimiz biliyoruz haftalar inanılmaz hızlı ve yoğun geçiyor. Tabii bu sürecin arkasında da gelen bir pazar günü (yatış değil dostlar kodlamamız ve kendi projelerimizi hayata geçireceğimiz bir gün 😅) gününü güzel bir şekilde değerlendiriyoruz. Hatta bazen de geleceğimize dair inovasyon fikirlerimizi kağıtlara not edip bunları gerçekleştirmede yoğunlaşıyoruz. Ne kadar güzel değil mi 😊. 

Güzel olduğunun tartışılması konusunu hepimiz içimizde yaşıyoruzdur dostlarım. Örnek olarak bu inovasyon fikirlerini veya hadi inovasyon fikrini geçtik işimizi kolaylaştıracak ufak püf noktaları kafamız sakinken doğabiliyor. Ben de geçen hafta pazar günü sakin bir anımda düşündüğüm ufak bir fikri hafta içerisinde ekip arkadaşlarımla konuşup hemen kodlamaya koyuldum ve bunun faydasını gördüm. Ardından gelen pazar günü yani bugün de sizlerle paylaşmak istedim. İçinizdeki sesi artık kafamda canlandırıyorum 😅

Hocamızın çenesi düştüyse tamam artık konu gittikçe uzayacak 😅

şeklinde sorularınızın olduğunu seziyorum. O halde sözümü daha fazla uzatmadan hemen başlıktan da anlayacağınız üzere "Klasör Zipleme ve İndirme" konumuza geçişimizi yapalım 😊. Bunun tanımına girmeyeceğim dostlarım (Yani zipleme nedir ve ne durumlarda kullanılır gibi). Bunu hepimiz artık. Ben direk PHP üzerinde zipleme işlemini nasıl yaptığımı anlatacağım 😊. O halde neden duruyoruz ? Hemen kodlama editörlerimizi açalım 😄

Öncelikle dostlarım kodlama editörlerimize gelelim ve bir çalışma alanı oluşturalım. Daha sonrasında 2 adet dosya oluşturalım 😊. Bunlara istediğiniz ismi verebilirsiniz. Ben index.php ve islem.php isimlerini verdim.

Daha sonrasında ise dostlarım ilk önce dosya upload edeceğimiz sayfanın tasarımıyla başlayalım. Hemen index.php isimli dosyamızı açalım ve

<!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">
    <title>PHP Klasör Zipleme | MFSoftware Blog</title>
</head>
<body>

<form action="islem.php" method="POST" enctype="multipart/form-data">
    <label for="">Dosyaları Seç</label>
    <input type="file" multiple name="dosyalar[]">
    <br><br>
    <button type="submit" name="send">Gönder</button>
</form>

</body>
</html>

şeklinde dosya yükleyeceğimiz alanın kodlamasını yapalım. Bu alan bu kadar dostlarım. İşte şimdi önemli alana geçişimizi yapıyoruz. Hemen islem.php isimli dosyamızı açalım ve

<?php

function convertToSEO($text)
{
    $turkce = array("ı", "İ", "ç", "Ç", "ş", "Ş", "ğ", "Ğ", "ü", "Ü", "ö", "Ö", "/", ".", ",", ";", ":", "!", "&", "(", ")", "[", "]", "_", "*", " ", '"', "'");
    $convert = array("i", "i", "c", "c", "s", "s", "g", "g", "u", "u", "o", "o", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", '-', "-");
    return strtolower(str_replace($turkce, $convert, trim($text)));
}

function remove_dir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object)
        {
            if ($object != "." && $object != "..")
            {
                if (is_dir($dir. "/" . $object)) {
                    remove_dir($dir . "/" . $object);
                } else {
                    unlink($dir . "/" . $object);
                }
            }
        }
        rmdir($dir);
    }
}


if (isset($_POST['send'])) {
    $resimler = $_FILES["dosyalar"]["name"];
    $tmp_isimler = $_FILES["dosyalar"]["tmp_name"];

    if (!file_exists("resimler")) {
        mkdir("resimler", 755);
    }

    // ZipArchive isimli sınıftan nesne türettik
    $ziple = new ZipArchive();

    // Zip dosyamızın ismi ve kaydedileceği yeri ayarladık
    $zipYol = "resimler.zip";

    // Zip dosyamızı açtık
    $status = $ziple->open($zipYol,  ZipArchive::CREATE);

    foreach ($resimler as $k => $v) {
         // bir resim ismi oluşturduk
        $resim_adi = convertToSEO(pathinfo($v, PATHINFO_FILENAME)) . "." . pathinfo($v, PATHINFO_EXTENSION);
        // o resmi klasörümüze kaydettik 
       move_uploaded_file($tmp_isimler[$k], "resimler/" . $resim_adi);
        // kaydedilen resmimizi klasör içinden çektik
        $ziple->addFile("resimler/".$resim_adi);
    }

    // zipleme işlemi bitti dosyamızı kapatma zamanı geldi :D
    $ziple->close();

    // zip dosyamızın yolunu aldık
    $zipinYolu = basename($zipYol);

    // zip dosyamızı indirme islemimiz için header bilgilerimizi girdik
    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$zipinYolu");
    header("Content-Length: " . filesize($zipYol));

    // zip dosyamızı indirdik
    readfile($zipYol);

    remove_dir("resimler");   // klasörümüzü sildik (içerisinde resimlerle beraber)
    unlink("resimler.zip");   // zip dosyamızı sildik
    exit;                           // işlemleri sonllandırdık

}

şeklinde kodlarımızı yazalım. Kodları görünce biraz garipsediniz ve tedirgin olur gibi baktığınızı sezer gibiyiim dostlarım. Anlıyorum ben de aynı yollardan geçtim ben de zaman zaman o durumlara geldim. Gayet net anlıyorum sizi. Ve işte bu kısımda devreye girip işi teorik bir anlatımdan uzaklaştırıp mantığını hızlı ve pratik şekilde anlatıp aklınızdaki soru işaretlerini bir çırpıda cevaplamak istiyorum. Şimdi elinize kağıt kalemi alıp sakince ufak ufak notlar ala ala giderseniz daha çabuk anlayacağınızın garantisini veriyorum 😊

Öncelikle dostlarım en baştan adım adım gelmek istiyorum. İlk alanımız

function convertToSEO($text)
{
    $turkce = array("ı", "İ", "ç", "Ç", "ş", "Ş", "ğ", "Ğ", "ü", "Ü", "ö", "Ö", "/", ".", ",", ";", ":", "!", "&", "(", ")", "[", "]", "_", "*", " ", '"', "'");
    $convert = array("i", "i", "c", "c", "s", "s", "g", "g", "u", "u", "o", "o", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", '-', "-");
    return strtolower(str_replace($turkce, $convert, trim($text)));
}

function remove_dir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object)
        {
            if ($object != "." && $object != "..")
            {
                if (is_dir($dir. "/" . $object)) {
                    remove_dir($dir . "/" . $object);
                } else {
                    unlink($dir . "/" . $object);
                }
            }
        }
        rmdir($dir);
    }
}

bu alandır dostlarım. Bu alana baktığınızda ve aklınızda

Biz ne yaptık burada acaba ?

Diye kendinize sorular yöneltmişseniz sizin aklınızda olan soru işaretlerini hemen cevaplandırıyorum. Biz bu kısımda öncelikle convertToSEO isimli fonksiyonu kullanmamızın sebebi ekleyeceğimiz dosya içerisindeki türkçe karakterlerin, büyük küçük harflerin vs seo uyumlu bir hale getirilmesini istiyoruz. Mesela örnek vermek gerekirse "MFSoftware Yazılım Dersleri" şeklinde bir yazının "mfsoftware-yazilim-dersleri" şekline getirilmesine olanak sağlıyoruz. Bunu ben dosya isimlendirme işlemlerinde kullandığım için yazdım. Siz de kullanabilirsiniz 😊. 

Diğer fonksiyonumuz olan remove_dir fonksiyonuna bakacak olursak ben bunu şu amaçla kullandım onu da anlatayım

Öncelikle bütün resimlerimizi karmaşıklık olmamak adına tek bir klasörde toplamak, daha sonra o klasör içerisinden zip dosyamıza ekleme işlemlerini yapmak ve ardından o klasörü silerek bütün dosyaları geri silmek 😊. Bu işlemler için ayarlama işlemimizi yaptık. Yani çok karmaşık bir işlem yok dostlarım 😊. Bu kısma kadar tamam isek gelelim bir diğer noktamıza

if (isset($_POST['send'])) { 
    // eğer butona basılıp post işlemi gelmiş ise
}

bunu php derslerimizin en başından beri biliyorsunuz 😊. Kendileri bir baska sayfaya post islemi yapıldığında kontrol etme işlemi olarak geçer 😊. Bunu yazalım ve aradaki boşluğu enter enter enter yaparak açalım. Şimdi o kısma uzuuuuun bir kod gircez 😊. Bu alanı da açtığımıza göre gelelim diğer yere ve en cafcaflı olan kısma

 $resimler = $_FILES['dosyalar']['name'];
    $tmp_isimler = $_FILES['dosyalar']['tmp_name'];

    if (!file_exists("resimler")) {
        mkdir("resimler", 755);
    }

    // ZipArchive sınıfından bir nesne oluşturalım
    $zipArchive = new ZipArchive();

    // Zip dosyasını kaydetmek istediğimiz yerin tam yolu burada
    $zipFilePath = 'resimler.zip';

    //Fonksiyonu çağıralım, klasörü açalım
    $status = $zipArchive->open($zipFilePath,  ZipArchive::CREATE);

    foreach ($resimler as $k => $v) {
        $resim_adi = convertToSEO(pathinfo($v, PATHINFO_FILENAME)) . "." . pathinfo($v, PATHINFO_EXTENSION);
        move_uploaded_file($tmp_isimler[$k], "resimler/" . $resim_adi);

        $zipArchive->addFile("resimler/".$resim_adi);
    }

    //Son olarak arşiv dosyasını kapatıyoruz.
    $zipArchive->close();

    // Zip dosyasının tam yolunu alalım
    $zipBaseName = basename($zipFilePath);

    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$zipBaseName");
    header("Content-Length: " . filesize($zipFilePath));

    readfile($zipFilePath);
    remove_dir("resimler");
    unlink("resimler.zip");
    exit;

kısmına bakacak olursak önce bütün dosyaların isimlerini (uzantısı dahil) ve tmp_name yani bizim dosyamızın geçici olarak saklandığı yerin ismini aldık. Bu kısma kada tamam isek gelelim diğer adımlara dostlarım

Zipleme öncesi bir klasör açtırma işlemi yaptırdım dostlarım. Yani amacımız bütün dosyaları zipleme öncesi burada tutmak ve zipleme sonrasında tüm dosyalarımızı bu belirtilen klasörü silerek tamamen yok etmek 😊. Amacımız tamamen bu dostlarım. 

Şimdi biz öncelikle klasörümüzün varlığını kontrol ettik. Benim işlemlerimde genelde resim ve görüntü kısmı olduğu için resimler olarak klasör açıyorum. Bu kısımda da resimler isimli bir klasör var mı yok mu kontrol ettirdim. Yok ise aç bir tane dedim 😊

Daha sonrasında php tarafından bize sunulan ZipArchive() class'ından bir nesne türettim ve ardından oluşturacağım zip dosyamın hangi dizin altında ve hangi isimde olacağını belirttim. Sonrasında bu zip dosyamı belirttiğim dizine oluşturdum ve içini açtım

Tüm dosyaların isimlerini ve geçici olarak saklandıkları yeri almış demiştim hatırlarsanız işte tam da bu kısımda bu döngüyü çalıştırıp konunun en başlarında bahsettiğim convertToSEO fonksiyonumu çalıştırdım. Dosyalarımın isimlerini aynı seflink mantığında oluşturdum ve uzantısını sonuna ekledim 😊. Daha sonra bu dosyayı resimler klasörüne yükletip oluşturduğum resimler.zip isimli dosyama eklettim.

Zip içerisine resim dosyalarımın aktarılma işlemlerinden sonra zip dosyamı kapattım ve bu zip dosyasının konum adresini (dosya yolunu) aldım

Daha sonrasında bu dosyamı yani resimler.zip isimli dosyamı indirebilmek için header() kodları yazdım. İçeriğin hangi tipte olacağı vs kodları yazdıktan sonra readfile() fonksiyonuna bu resimler.zip isimli dosyamın yolunu yazıp indirme işlemini ayarladım. Sonrasında ek olarak bu resimler klasörümü ve resimler.zip isimli zip dosyamı silerek akışı durdurdum dostlarım. Bütün süreç bu işte 😉

 

Eveeeet dostlarım bu yazımda sizlere PHP programlama dili üzerinde dosya sıkıştırma işleminin nasıl yapıldığını elimden geldiğince dilim döndüğünce anlatmaya çalıştım. Umarım faydalı olmuşumdur 😊. Eksik veya hatalı bir anlatım yapmış isem benimle iletişime geçmekten çekinmeyin 😊. Konu başlarda biraz karmaşık veya zor gelebilir dostlarım anlıyorum. Özellikle öğrenme süreci içerisinde bu durumu yaşamamız gayet normaldir 😊. Bu ve bunu gibi durumlarda sizlerden yapmanızı istediğim tek şey her yazımın sonunda da dediğim gibi "İstikrarlı ve Azimli Olmalısınız, Bolca Pratik Yapmalısınız". Bu dediğimi hayat felsefeniz yaptığınız sürece başarı sizler için kaçınılmaz olacaktır.

Hayallerinizi gerçekleştirmeniz ve güzel yerlere gelmeniz dileklerimle... İyi çalışmalar dilerim 😊

Muhammed Fatih BAĞCIVAN
Yazar Hakkında

Kendi Halinde Bir Backend Developer

Önceki YazıPHP Üzerinde Neden <? Kullanmamalıyız
Sonraki YazıPHP Goto Kullanımı
Yorumlar (1)
Zafer Yıldız
21.11.2021

Ellerine sağlık bu bir çok yerde işimize yarar diye düşünüyorum :)

Yorum Yapabilirsiniz