Adakalanya kita membutuhkan script untuk mendowload beberapa file menjadi satu file zip untuk mempermudah dalam melakukan download pada halaman website.
Berikut cara membuat script untuk proses pengabungan file menjadi satu file zip :
<?php</code><br /><code class="language-php">$directory = "Directory_Name";</code><br /><code class="language-php">$zip_file_name = "Nama_File.zip";</code><br /><code class="language-php">$download_file = true;</code><br /><br /><code class="language-php">class FlxZipArchive extends ZipArchive {</code><br /><code class="language-php"> /** Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private **/</code><br /><br /><code class="language-php"> public function addDir($location, $name) {</code><br /><code class="language-php"> $this->addEmptyDir($name);</code><br /><code class="language-php"> $this->addDirDo($location, $name);</code><br /><code class="language-php"> } // EO addDir;</code><br /><br /><br /><code class="language-php"> /** Add Files & Dirs to archive;;;; @param string $location Real Location; @param string $name Name in Archive;;;;;; @author Nicolas Heimann</code><br /><code class="language-php"> * @access private **/</code><br /><code class="language-php"> private function addDirDo($location, $name) {</code><br /><code class="language-php"> $name .= '/';</code><br /><code class="language-php"> $location .= '/';</code><br /><br /><code class="language-php"> // Read all Files in Dir</code><br /><code class="language-php"> $dir = opendir ($location);</code><br /><code class="language-php"> while ($file = readdir($dir))</code><br /><code class="language-php"> {</code><br /><code class="language-php"> if ($file == '.' || $file == '..') continue;</code><br /><code class="language-php"> // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File();</code><br /><code class="language-php"> $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';</code><br /><code class="language-php"> $this->$do($location . $file, $name . $file);</code><br /><code class="language-php"> }</code><br /><code class="language-php"> } // EO addDirDo();</code><br /><code class="language-php">}</code><br /><br /><code class="language-php">$zip_achive = new FlxZipArchive;</code><br /><code class="language-php">$$zip_achive_open = $zip_achive->open($zip_file_name, ZipArchive::CREATE);</code><br /><code class="language-php">if($$zip_achive_open === TRUE)</code><br /><code class="language-php">{</code><br /><code class="language-php"> $zip_achive->addDir($directory, basename($directory));</code><br /><code class="language-php"> $zip_achive->close();</code><br /><code class="language-php">} else { </code><br /><code class="language-php"> $download_file = false;</code><br /><code class="language-php"> echo 'Could not
create a zip archive';</code><br /><code class="language-php">}</code><br /><br /><code class="language-php">if ($download_file)</code><br /><code class="language-php">{</code><br /><code class="language-php"> ob_get_clean();</code><br /><code class="language-php"> header("Pragma: public");</code><br /><code class="language-php"> header("Expires: 0");</code><br /><code class="language-php"> header("Cache-Control: must-revalidate, post-check=0, pre-check=0");</code><br /><code class="language-php"> header("Cache-Control: private", false);</code><br /><code class="language-php"> header("Content-Type: application/zip");</code><br /><code class="language-php"> header("Content-Disposition: attachment; filename=" . basename($zip_file_name) . ";" );</code><br /><code class="language-php"> header("Content-Transfer-Encoding: binary");</code><br /><code class="language-php"> header("Content-Length: " . filesize($zip_file_name));</code><br /><code class="language-php"> readfile($zip_file_name);</code><br /><code class="language-php"> unlink($zip_file_name);</code><br /><code class="language-php">}</code><br /><br /><code class="language-php">?>
Selamat mencoba, terima kasih
Apa itu ZipArchive?
Kompresi folder menjadi format ZIP sangat berguna untuk:
- Backup data - Mengkompres folder sebelum diunduh atau dikirim
- Distribusi file - Mengirim banyak file dalam satu paket
- Penyimpanan - Menghemat ruang disk
Metode 1: Zip Seluruh Folder
<?php
$zip = new ZipArchive();
$filename = 'backup_' . date('Y-m-d') . '.zip';
if ($zip->open($filename, ZipArchive::CREATE) === TRUE) {
$folder = 'path/to/folder';
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($folder),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($folder) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
echo "Zip berhasil: $filename";
} else {
echo "Gagal membuat zip";
}
?>
Tips dan Best Practices
- Password protection - Gunakan opsi enkripsi untuk file sensitif
- Progress tracking - Untuk folder besar, tampilkan progress ke user
- Error handling - Tangani file yang locked atau permission denied
- Kompresi level - Sesuaikan level kompresi antara ukuran dan kecepatan