Indonesian (Bahasa Indonesia) translation by Anthoni Hermanto (you can also view the original English article)
ThemeForest memiliki fitur yang bagus; yaitu memperbolehkan penulis untuk mengupload file zip yang terdiri dari screenshot dari temanya. Script tersebut kemudian diekstrak dan menunjukkan gambar yang sesuai. Walaupun saya ragu kalau developer menggunakan PHP untuk menyelesaikan tugas ini...itulah apa yang akan kita gunakan!
Apa yang Harus Kita Lakukan
- Buat form upload simple yang membolehkan pengguna untuk memilih file zip.
- Pastikan kalau pengguna memilih file zip, dan kemudian simpan sebagai file unik.
- Ekstrak konten dari file zip dan simpan ke dalam folder spesifik.
- Hapus file zip dan kemudian echo kontennya.
Langkah 1: Membuat Form Upload

- Buat file baru dan simpan sebagai index.html pada root dari solusi Anda.
- Berikutnya, kita akan membuat form simple. Paste berikut ini ke dalam.
<form enctype="multipart/form-data" action="" method="post"> <input type="file" name="fupload" /><br /> <input type="submit" value="Upload Zip File" /> </form>
Jika Anda akan mengizinkan pengguna untuk mengupload file, anda harus men set "enctype" dari tag form menjadi "multipart/form-data". Kemudian kita akan men set action ke halaman yang sama dan method ke post.



Untuk menjaga semua agar tetap seramping mungkin, kita hanya perlu file input dan tombol submit. Catatan jika kita telah mengatur nama file input menjadi "fupload". Kita akan sesegera mungkin menggunakan nilai ini untuk menentukan halaman telah melakukan post kembali.
Langkah 2: Menulis PHP
Pada bagian paling atas dari halaman index.php Anda, sebelum doctype telah dideklarasikan, tempelkan berikut ke dalam:
<?php if(isset($_FILES['fupload'])) { $filename = $_FILES['fupload']['name']; $source = $_FILES['fupload']['tmp_name']; $type = $_FILES['fupload']['type'];
Mari ambil selangkah demi selangkah.
- Jika tag input dengan nama "fupload" telah diatur, maka jalankan kode berikut, selain itu, jangan lakukan apapun.
- Sekarang kita perlu membuat sedikit variabel. Kita perlu mengambil nama dari file yang diunggah, direktori di mana file disimpan sementara, dan jenis file yang dipilih.
Mari asumsikan bahwa pengguna memilih file yang disebut "myPics.zip".
- $_FILES['fupload']['name'] = "myPics.zip"
- $_FILES['fupload']['tmp_name'] = direkotri sementara pada server.
- $_FILES['fupload']['type'] = "application/zip". (Nilai ini dapat berubah tergantung dari browser mana file diupload)



Berikutnya, mari bagi nama file menjadi dua: namanya, dan ekstensinya.
$name = explode('.', $filename); $target = 'extracted/' . $name[0] . '-' . time() . '/';
Lanjutkan dengan contoh kita file "myPics.zip" - $name[0] akan sama dengan "myPics". $name[1] akan sama dengan "zip".
Berikutnya, kita akan membuat variabel baru yang disebut "$target". Ini akan menjadi lokasi tempat file kita akan disimpan. Untuk memastikan kalau pengguna lain dengan nama "myPics" yang sama tidak tertimpa, maka kita harus memastikan kalau kita menyimpan file ke dalam lokasi yang unik. Untuk menyelesaikan tugas, kita akan mengimplementasikan fungsi "time()". Jika kita membubuhkan nilai ini kedalam nama file yang telah diupload, kita dapat yakin kalau kita akan berakhir dengan nama folder yang berbeda!
$target = "extracted/myPics-02151985/"
Langkah 3: Pastikan Kalau File Zip Telah Terpilih
Sesegera mungkin menuju variabel $target Anda, tempelkan berikut:
$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; } }
- Kita mulai dengan membuat array bernama $accepted_types. Pencarian cepat Google untuk "zip mimpe types" akan membawakan kita empat nilai: 'application/zip','application/z-zip-compressed','multipart/x-zip','application/s-compressed'. Setiap browser memiliki cara tersendiri untuk mendaftarkan jenis file. Kita harus pastikan setiap nilai dari instansi.
- Untuk melakukan hal tersebut, kita mengecek untuk melihat jika ada item pada array kita yang memiliki nilai sama dengan "$_FILES['fupload']['type']. Jika mereka memilikinya, kita akan mengatur variabel "$okay" menjadi "true" - dan dapat berpisah dari statemen 'for' dan memastikan sisanya bahwa pengguna telah memilih file zip.
Sayangnya, Safari dan Chrome tidak mendaftarkan zip file. Ini menimbulkan masalah untuk kita. Setelah sedikit penelitian, saya tidak dapat menemukan solusi yang mudah - tanpa menggunakan ekstensi (PEAR). Sebagai gantinya, kita akan memastikan kalau nama file paling tidak berakhir dengan "zip". Seharusnya perlu dicatat jika ini tidak 100% aman. Bagaimana jika pengguna mengunggah jenis file yang berbeda yang berakhiran 'zip'? Silahkan tawarkan rekomendasi! :)
$okay = strtolower($name[1]) == 'zip' ? true: false;
- Kita akan menggunakan operator ternary untuk menjaga statemen ini sesuai garis. Jika ekstensi dari nama file ($name[1]) sama dengan 'zip', kita akan mengatur $okey ke true. Selain itu, itu akan sama dengan 'false'.
Berikutnya, kita akan mengecek untuk melihat jika $okay itu false. Jika ya, kita tahu kalau file 'zip' tidak dipilih. Pada kasus tersebut, kita akan menghentikan PHP.
if(!$okay) { die("Please choose a zip file, dummy!"); }
Langkah 4: Menyimpan File Zip
mkdir($target); $saved_file_location = $target . $filename; if(move_uploaded_file($source, $saved_file_location)) { openZip($saved_file_location); } else { die("There was a problem. Sorry!"); }
- Pertama kita akan perlu membuat direktori yang kita referensikan dengan variabel $target kita. Ini dapat dengan mudah diselesaikan dengan fungsi "mkdir"
- Berikutnya, mari coba memindahkan file yang diunggah, dari direktori sementara, ke direktori $target. Jika prosedur itu dapat dilakukan dengan sukses, kita akan memanggil fungsi "openZip".
Langkah 5: Fungsi openZip()
Buat halaman baru dan simpan itu sebagai "function.php". sekarang tambahkan kode berikut:

<?php function openZip($file_to_open) { global $target; $zip = new ZipArchive(); $x = $zip->open($file_to_open); if($x === true) { $zip->extractTo($target); $zip->close(); unlink($file_to_open); } else { die("There was a problem. Please try again!"); } } ?>
Fungsi ini akan menerima satu parameter: $file_to_open. Parameter ini akan mengandung lokasi dari file zip yang sedang kita coba ekstrak!
- Untuk menggunakan kelas ZipArchive(), pertama Anda harus memastikan untuk mengizinkan 'php_zip.dll' pada file "php.ini" anda. Dengan mudah cari string tersebut, dan hapus titik koma.
- Dengan beberapa class, kita perlu membuat instansi baru dari objek. Kita akan memanggil method "open" dan melewaatkannya dalam lokasi file yang seharusnya dibuka. Jika dilakukan dengan sukses, metode ini akan kembali 'true'. Jika itu kasusnya, kita akan mengekstrak konten dari file zip ke dalam folder. Kita telah membuat jalan menuju folder ini ketika kita membuat variabel $target. (Catatan - Untuk dapat mengakses variable tersebut, Anda harus menambahkan "global" di depan variabel. Ini akan mengatakan kepada PHP untuk pergi keluar dari fungsi sekarang dan mencari variabel $target)
- Setelah file telah diekstrak, kita akan menghapus file zip - sebagaimana sudah tidak membutuhkannya!
Ingat - kita telah membuat file baru 'function.php', tetapi kita perlu memasukannya! Bubuhkan berikut ke bagian atas halaman 'index.php' Anda, segera setelah pembuka tag PHP.
require_once 'functions.php';
Echo kontennya

Apa yang kita miliki sejauh ini bekerja dengan sempurna! Tetapi, untuk memberi Anda umpan balik, mari pindai direktori yang baru dan echo kontennya. Anda seharusnya menghapus blok kode berikut dari proyek anda. Ini hanya untuk menguji. Jika anda ingin menahannya, echo informasinya keluar dalam tag body.
$scan = scandir($target . $name[0]); print '<ul>'; for ($i = 0; $i<count($scan); $i++) { if(strlen($scan[$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 '<li>' . $scan[$i] . '</li>'; } else { echo '<li><a href="' . $target . $name[0] . '/' . $scan[$i] . '">' . $scan[$i] . '</a></li>'; } } } print '</ul>'; }
Saya tidak akan membahas bagian ini terlalu banyak - karena itu tidak perlu. Bagaimanapun, jika anda ingin penjelasan penuh, pastikan menonton screencast terkait! Untuk menyimpulkannya dengan cepat, script terakhir memindai direktori baru kita dan melakukan echo pada daftar tak berurut yang mengandung konten.
Selesai
Tidak terlalu sulit, bukan? Ini fitur rapih yang bisa dengan mudah diimplementasikan pada proyek anda. Apa yang anda pikirkan untuk keamanan ketika tiba saatnya mengunggah file zip? Bagaimana Kita bisa yakin kalau file zip tersebut tidak membahayakan? Saya ingin mendengar pendapat semuanya tentang implikasi keamanan. Jika tidak ditangani dengan benar, peretas dapat membahayakan server. Mari diskusikan hal itu! Ini memungkinkan mencari jenis file yang berbahaya (file .htaccess) dan menghapusnya.
Halaman akhir Index.php.
<?php include 'functions.php'; if(isset($_FILES['fupload'])) { $filename = $_FILES['fupload']['name']; $source = $_FILES['fupload']['tmp_name']; $type = $_FILES['fupload']['type']; $name = explode('.', $filename); $target = 'extracted/' . $name[0] . '-' . time() . '/'; // Ensures that the correct file was chosen $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; } } //Safari and Chrome don't register zip mime types. Something better could be used here. $okay = strtolower($name[1]) == 'zip' ? true: false; if(!$okay) { die("Please choose a zip file, dummy!"); } mkdir($target); $saved_file_location = $target . $filename; if(move_uploaded_file($source, $saved_file_location)) { openZip($saved_file_location); } else { die("There was a problem. Sorry!"); } // This last part is for example only. It can be deleted. $scan = scandir($target . $name[0]); print '<ul>'; for ($i = 0; $i<count($scan); $i++) { if(strlen($scan[$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 '<li>' . $scan[$i] . '</li>'; } else { echo '<li><a href="' . $target . $name[0] . '/' . $scan[$i] . '">' . $scan[$i] . '</a></li>'; } } } print '</ul>'; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>How to Upload and Open Zip Files With PHP</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <div id="container"> <h1>Upload A Zip File</h1> <form enctype="multipart/form-data" action="" method="post"> <input type="file" name="fupload" /><br /> <input type="submit" value="Upload Zip File" /> </form> </div><!--end container--> </body> </html>
- Berlangganan pada NETTUTS RSS Feed untuk lebih banyak tus web development dan artikel.