Bazı web sitelerinin siz bir ZIP dosyası gönderdiğinizde ilgili dosyayı açıp içindeki dosyaları sitenin tercihlerine göre işlediğine şahit olmuşunuzdur. NETTUTS’ta yayımlanan bu makale ile sizlere PHP kullanarak Zip dosyalarının nasıl açılabileceğini açıklamaya çalışacağım.Yapmamız Gerekenler
* Kullanıcıların zip dosyası seçmelerini sağlayacak basit bir upload formu oluştur* Kullanıcının zip dosyası seçtiğinden emin ol ve ardından onu tekil bir dosya olarak kaydet.* Zip’in içindeki dosyaları bir klasöre çıkar* Zip dosyasını sil ve içeriğini göndericiye göster.Adım 1: Upload Formunu Oluşturmak

* Yeni bir dosya oluşturun ve onu index.html olarak kaydederek sitenizin root klasörüne kaydedin.* Sırada, basit bir form oluşturmak var. Aşağıdaki kodu yapıştırın.



Kullanıcılarınızın dosya göndermesine izin vereceğinz her zaman, form etiketindeki “enctype” değerini “multipart/form-data” olarak değiştirmeniz gerekir. Ardından formun hedefini forumun bulunduğu sayfaya yönlendirecek, ve “method” değerini “post” olarak belirteceğiz.

Her şeyi mümkün olduğu kadar sade tutabilmek için sadece dosya giriş alanı ve gönder düğmemiz var. Dosya giriş alanının adını “fupload” olarak belirlediğimize dikkat edin. Birazdan bu değeri sayfanın geri gönderilip gönderilmediğini kontrol etmek için kullanacağız.Adım 2: PHP’yi Yazmak
index.php sayfanızın en üzerinde, doctype değeri henüz belirtilmeden aşağıdaki kodu girin: Adım adım anlatalım:* Eğer “fupload” adındaki input etiketi belirtilmişse, o zaman aşağıdaki kodu çalıştır, belirtilmemişse hiçbir şey yapma.* Şimdi birkaç değişken oluşturmamız gerek. Gönderilen dosyanın adını almamız, dosyanın geçiçi olarak depolanacağı klasörü ve seçili dosyanın türünü belirlememiz gerek.Diyelim kullanıcı “myPics.zip” adında bir dosya seçmiş olsun.* $_FILES[‘fupload’][‘name’] = “myPics.zip”* $_FILES[‘fupload’][‘tmp_name’] = dosyanin sunucuda depolanacagi gecici alan.* $_FILES[‘fupload’][‘type’] = “application/zip”. (Bu deger dosyanin gonderildigi tarayiciya göre degisiklik gosterecektir.

Şimdi, dosya adını ve uzantısını ayıralım:$name = explode(‘.’, $filename);$target = ‘extracted/’ . $name[0] . ‘-‘ . time() . ‘/’; “myPics.zip” dosya örneğimizde olduğu gibi – $name[0] “myPics” değerini, $name[1] “zip” değrini alacak.Şimdi, $target adında bir değişken oluşturalım. Bu değişken dosyamızın sunucuda kaydedilecek konumunu belirtsin. Başka bir kullanıcının “myPics” adında bir dosya göndererek halihazırda sunucuda bulunan “myPics” dosyasının üzerine yazmasını enlemek için gönderilen dosyanın tekil bir yere kaydedilmiş olduğundan emin olmamız gerek. Bu görevi yerine getirebilmemiz için “time()” fonksiyonunu dahil edeceğiz. Eğer bu değeri gönderilen dosyanın adına dahil edersek her zaman tekil bir klasör adı kullanılacağından emin olabiliriz.$target = “dosyalar/myPics-31122009/”Adım 3: Zip Dosyasının Seçili Olduğundan Emin Ol
$target değrinden hemen sonra aşağıdaki kodu yapıştırın:$accepted_types = array(‘application/zip’, ‘application/x-zip-compressed’, ‘multipart/x-zip’, ‘application/s-compressed’);foreach($accepted_types as $mime_type) {if($mime_type == $type) {$okay = true;break;}} * $accepted_types dizisini oluşturarak başlıyoruz. Hızlı bir “zip mime types” Google araması bize dört adet değeri veriyor: ‘application/zip’, ‘application/x-zip-compressed’, ‘multipart/x-zip’, ‘application/s-compressed’. Her tarayıcının dosya türlerini kaydetmek için kendine özgü yöntemleri bulunuyor. Biz ileride olası hataları önlemek için her değeri kontrol etmek zorundayız.
* Bunu yapmak için, öncelikle dizimizdeki öğelerden herhangi birinin “$_FILES[‘fupload’][‘type’] ” değerine sahip olup olmadığını kontrol etmemiz lazım. Eğer sahipse, o zaman “$okay” değişkenimizi ‘true’ olarak belirleyecek – ve ‘for’ komutu ile de kullanıcının zip dosyasını seçtiğinden emin olacağız.Ne yazık ki Safari ve Chrome tarayıcları zip dosyaları için türü kaydetmiyorlar. Bu da bizim için bir problem oluşturuyor. Biraz araştırmadan sonra, PEAR uzantısını kullanmadan basit bir çözüm bulamadım. Bunun yerine biz de en azından dosya adının .zip ile bittiğinden emin olmamız gerekecek. Bunun %100 güvenli olmadığını bilyorum. Ya kullanıcı uzantısı .zip olan başka bir dosya gönderirse? Yorumlarınızı bekliyorum.$okay = strtolower($name[1]) == ‘zip’ ? true: false; * Bu komutu tek bir satırda kullanabilmek için üçlü operatörü kullanacağız. Eğer ($name[1]) dosyasının uzantısı ‘zip’e eşitse, $okay değişkeninin değerini true olarak atayacağız. Değilse ‘false’ olacak.Sırada $okay değişkeninin değerinin false olup olmadığını kontrol edeceğiz. Eğer false ise ‘zip’ dosyasının seçilmediğini anlayacağız. Bu durumda PHP’ye kodu işlemeyi durdurmasını söyleyeceğiz.if(!$okay) {die(“Lütfen bir zip dosyası seçin!”);} Adım 4: Zip Dosyasını Kaydetmek mkdir($target);$saved_file_location = $target . $filename;if(move_uploaded_file($source, $saved_file_location)) {openZip($saved_file_location);} else {die(“Bir problem oluştu!”);} * Öncelikle $target değerinden aldığımız dizini oluşturmamız gerek. Bu kolayca “mkdir” komutu ile gerçekleştirilebiir.* Sırada gönderilen dosyayı geçici klasörden $target dizinimize taşımayı deneyelim. Eğer bu işlem başarıyla tamamlandıysa, “openZip” fonksiyonunu çağırabiliriz.Adım 5: openZip() Komutu
Yeni bir sayfa oluşturun ve “functions.php” adıyla kaydedin, sonra aşağıdaki kodu yapıştırın.

open($file_to_open);if($x === true) {$zip->extractTo($target);$zip->close();unlink($file_to_open);} else {die(“Bir problem oluştu. Lütfen tekrar deneyin!”);}}?> Bu fonksiyon sadece bir parametreyi kontrol edecektir: $file_to_open. Bu parametre açmaya çalıştığımız zip dosyasının konumunu içerecektir.* ZipArchive() sınıfını kullanabilmek için öncelikle “php.ini” dosyanızda ‘php_zip.dll’ dosyasını aktif hale getirdiğinizden emin olun. ‘php_zip.dll’ terimini “php.ini” dosyası içerisinde aratın ve ardından tırnak işaretlerini kaldırın.

* Her sınıfta olduğu gibi nesne için yeni bir örnek yaratmamız gerekecek. Şimdi “open” metodunu kullanacak ve dosyanın açılması gerektiği konumu aktaracağız. Eğer başarıyla gerçekleştiyse bu metod bize ‘true’ değerini verecektir. Eğer durum buysa o zaman zip dosyasının içeriğini klasöre açacağız. Bu klasörün konumunu $target değişkenini oluştururken belirtmiştik. (Not: Bu değişkene ulaşabilmek için değişkenin önüne “global” değerini eklemeniz gerekiyor. Bu kod PHP’ye geçerli fonksiyonun dışına çıkmasını ve $target değişkenini aramasını söylüyor).* Tüm dosyalar aktarıldığında zip dosyasını sileceğiz, zira artık onunla bir işimiz kalmadı.Unutmayın – functions.php dosyamızı oluşturduk ancak onu dahil etmemiz gerekiyor. Aşağıdaki kodu ‘index.php’ sayfanızın üst kısmına, PHP açılış etiketinin hemen ardına ekleyin.require_once ‘functions.php’; İçeriği Yazdırmak

Şimdiye kadarki her şey sorunsuz çalışıyor. Ancak size biraz geribildirim vermek için, yeni dizini taratalım ve içeriğini ekrana yazdıralım. Aşağıdaki kodu projenizden silmeniz gerek, zira bu kod sadece test etmeniz için var. Eğer kodu kullanmak istiyoesanız, o zaman bilgiyi echo kullanarak body etiketi içerisinde yazdırın. $scan = scandir($target . $name[0]);print ‘

    ‘;for ($i = 0; $i= 3) {$check_for_html_doc = strpos($scan[$i], ‘html’);$check_for_php = strpos($scan[$i], ‘php’);if($check_for_html_doc === false && $check_for_php === false) {echo ‘

  • ‘ . $scan[$i] . ‘
  • ‘;
    } else {echo ‘

  • ‘ . $scan[$i] . ‘
  • ‘;
    }}}print ‘

‘;
} Bu son bölüm hakkında çok konuşmayacağım – çünkü gerekli değil. Çok kısaca, yukarıdaki betik yeni dizinimizi tarıyor ve içeriğini sırasız liste olarak ekrana yazdırıyor.Bitti
Çok zor değildi, değil mi? Projelerinize kolayca dahil edebileceğiniz kullanışlı bir özellik. Zip dosyaları gönderirken oluşabilecek olası güvenlik açıklarına yönelik görüşleriniz neler? Zip dosyasının içeriğinin zararsız olacağından nasıl emin olabiliriz? Bu güvenlik konularında herkesin yorumlarını duymak isterim. Eğer dikkatli bir şekilde kullanılmadığında bir bilgisayar korsanı sunucunuza ciddi zararlar verebilir. Gelin tartışalım! Tehlikeli dosyaları aramak (.htaccess dosyaları) ve silmek mümkün.index.php Sayfasının Son Hali ‘;for ($i = 0; $i= 3) {$check_for_html_doc = strpos($scan[$i], ‘html’);$check_for_php = strpos($scan[$i], ‘php’);if($check_for_html_doc === false && $check_for_php === false) {echo ‘

  • ‘ . $scan[$i] . ‘
  • ‘;
    } else {echo ‘

  • ‘ . $scan[$i] . ‘
  • ‘;
    }}}print ‘

    ‘;
    }?>How to Upload and Open Zip Files With PHP

    Upload A Zip File