Membuat file zip dengan PHP sebenarnya sangat mudah karena PHP sendiri sudah memiliki class yang bernama ZipArchive. Nah pada tutorial kali ini kita akan membahas beberapa kemungkinan kasus dalam membuat file zip dalam projek kamu nanti.
1. Membuat file zip dari file
Kode dibawah ini adalah contoh membuat sebuah file dengan nama new.zip
.
<?php
$zip = new ZipArchive;
if ($zip->open('new.zip', ZipArchive::CREATE) === TRUE) {
// point 1
$zip->addFile('file1.txt');
$zip->addFile('file2.pdf');
// point 2
$zip->addFile('file3.txt', 'oldfile.txt');
// point 3
$zip->addFromString('new.txt', 'text to be added to the new.txt file');
// point 4
$zip->close();
}
Daftar Isi
Penjelasannya:
- line 2 kita membuat sebuah instant baru dari class
ZipAchive
dengan nama$zip
- line 3 kita membuat sebuah zip file dengan nama
new.zip
dan jika berhasil maka kita bisa lanjut untuk mengisinya dengan file yang kita inginkan. - point 1: kita memasukkan
file1.txt
ke dalam file zip. Artinya filefile1.txt
sudah ada di dalam directory - point 2: kita akan memasukkan file dengan nama oldfile.txt yang ada di folder tapi kita akan merubahnya menjadi
file2.txt
di dalam zip. - point 3: fungsi
addFromString
berfungsi untuk membuat sebuah file dari string. Jadi file new.txt tidak ada di dalam folder kita tapi kita akan buat dari string. - poin 4: fungsi
close()
untuk menutup dan menyimpan perubahan yang kita buat di file new.zip
Note: hati-hati dengan path file yang mau kamu tambahkan. Dalam contoh di atas, semua file berada di dalam folder.
2. Overwrite file zip yang sudah ada
Jika kita ingin mengoverwrite file zip yang sudah ada seperti file new.zip maka kita hanya perlu manambahkan variable ZipArchive::OVERWRITE
<?php
$zip = new ZipArchive;
if ($zip->open('new.zip', ZipArchive::OVERWRITE) === TRUE) {
//poin 1
$zip->addFile('file1.txt','newfile.txt');
//point 2
$zip->addFile('file2.pdf');
// All files are added, so close the zip file.
$zip->close();
}
Penjelasannya:
- Point 1: kita akan merewrite file1.txt dengan newfile.txt
- point 2: file2.pdf yang sudah ada di zip sebelumnya akan ditumpuk oleh file2.pdf yang baru
3. Membuat file zip tapi memodifikasi isi folder di dalam zip tersebut.
Selanjutnya kita akan membuat folder-folder dalam file zip yang akan kita buat.
<?php
$zip = new ZipArchive;
if ($zip->open('new.zip', ZipArchive::CREATE) === TRUE) {
//poin 1
$zip->addFile('text.txt', 'demo_folder/test.txt');
$zip->addFile('test.pdf', 'demo_folder/test.pdf');
//poin 2
$zip->addFile('random.txt', 'demo_folder/newfile.txt');
//poin 3
$zip->addFromString('demo_folder/new.txt', 'text to be added to the new.txt file');
// All files are added, so close the zip file.
$zip->close();
}
Penjelasannya:
- poin 1: kita akan membuat file text.txt tapi mengambil file yang ada di folder
demo_folder/text.txt
- poin 2: seperti dari poin 1, file newfile.txt yang ada di demo_folder akan kita simpan tanpa folder dan namanya dirubah menjadi random.txt
- poin 3: kita akan membuat sebuah file di dalam folder demo_folder di dalam zip
4. Membuat zip dari sebuah folder
Untuk membuat file dari sebuah folder kita perlu mengambil semua file yang ada di dalam folder tersebut dengan bantuan fungsi opendir, lalu memasukkan satu-persatu filenya ke dalam file zip.
<?php
$zip = new ZipArchive;
if ($zip->open('new.zip', ZipArchive::OVERWRITE) === TRUE) {
//point 1
if ($handle = opendir('demo_folder'))
// point 2
while (false !== ($entry = readdir($handle)))
{
//point 3
if ($entry != "." && $entry != ".." && !is_dir('demo_folder/' . $entry))
{
//point 4
$zip->addFile('demo_folder/' . $entry);
}
}
closedir($handle);
}
$zip->close();
}
Penjelasan:
- poin 1: kita memakai fungsi opendir untuk membuka file demo_folder
- poin 2: kita looping untuk mendapatkan semua filename yang ada di dalam folder tersebut
- poin 3: skip untuk ., .., dan folder di dalam demo_folder
- poin 4: menambahkan file ke dalam zip
Note: hati-hati jika masih ada folder di dalam folder demo_folder, karena proses zip akan error. jadi kamu bisa melakukan checking lagi jika ada folder maka lakukan looping lagi.
5. Membuat zip dari gabungan beberapa file dan folder sekaligus
Dari contoh di atas, kita akan coba gabungkan jadi kita bisa membuat sebuah zip file yang berisi file dari beberapa folder dan file sekaligus.
<?php
$zip = new ZipArchive;
if ($zip->open('test_files_dirs.zip', ZipArchive::OVERWRITE) === TRUE)
{
// Add directory1
if ($handle = opendir('demo_folder/directory1/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory1/' . $entry);
}
}
closedir($handle);
}
// Add directory2
if ($handle = opendir('demo_folder/directory2/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory2/' . $entry);
}
}
closedir($handle);
}
// Add directory3
if ($handle = opendir('demo_folder/directory3/'))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$zip->addFile('demo_folder/directory3/' . $entry);
}
}
closedir($handle);
}
// Add more files
$zip->addFile('demo_folder/index.txt');
$zip->close();
}
Selanjutnya?
Sepertinya akan lebih gampang jika kita memiliki sebuah fungsi yang bisa mempermudah proses pembuatan zip. Jadi kita bisa memasukkan nama folder atau file kemudian nama zip yang di inginkan kemudian file zip kita sudah selesai dibuat. Jadi contohnya seperti di bawah ini:
<?php
/* creates a compressed zip file */
function create_zip($files = array(),$destination = '',$overwrite = false)
{
//if the zip file already exists and overwrite is false, return false
if(file_exists($destination) && !$overwrite) { return false; }
//vars $valid_files = array();
//if files were passed in...
if(is_array($files)) {
//cycle through each file
foreach($files as $file)
{
//make sure the file exists
if(file_exists($file)) {
$valid_files[] = $file;
}
}
}elseif(is_dir($files)){
if ($handle = opendir($files))
{
while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != ".." && !is_dir($files.'/' . $entry))
{
$valid_files[] = $files.'/' . $entry;
}
}
closedir($handle);
}
}
//if we have good files...
if(count($valid_files)) {
//create the archive
$zip = new ZipArchive();
if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
return false;
}
//add the files
foreach($valid_files as $file) {
$zip->addFile($file,$file);
}
//close the zip -- done!
$zip->close();
//check to make sure the file exists
return file_exists($destination);
}
else
{
return false;
}
}
Kita punya sebuah fungsi dengan nama create_zip yang memiliki parameter berupa:
- Nama file atau folder atau bisa memasukkan list file berupa array
- Destinasi atau nama zip file yang akan kita buat
- Terakhir adalah overwrite status, jika trus maka zip file akan di overwrite.
Cara memakai fungsi di atas akan kita jelaskan di bawah ini:
<?php
$files_to_zip = array(
'new.txt',
'new2.txt',
'new3.txt',
);
//if true, good; if false, zip creation failed
$result = create_zip($files_to_zip,'my-archive.zip');
$folder_name = 'testing';
//if true, good; if false, zip creation failed
$result = create_zip($folder_name,'my-archive2.zip',TRUE);
Penjelasan:
Contoh pertama kita membuat zip file dari list file yang ada di dalam array $files_to_zip, kemudian di contoh kedua kita membuat zip dari sebuah folder yang bernama testing dengan overwrite status trus. Jadi jika sebelumnya sudah ada file my-archive2.zip maka akan di overwrite.
Jadi itu sedikit banyak tentang bagaimana cara membuat zip dengan PHP. Kamu mencobanya sekarang dan memodif semua contoh di atas sesuai dengan kebutuhan kamu.