Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Cara Zip dan Unzip File di PHP

by
Difficulty:IntermediateLength:MediumLanguages:

Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)

Mengompresi file saat mentransfernya melalui internet memiliki banyak keuntungan. Dalam banyak kasus, ukuran total gabungan semua file dalam format terkompresi turun dengan margin yang bagus. Ini berarti Anda akan menghemat sebagian bandwidth Anda, dan pengguna juga akan mendapatkan kecepatan unduh yang lebih cepat. Setelah pengguna mengunduh file, mereka dapat mendekompresi kapan pun mereka mau. Singkatnya, kompresi dapat membuat penyajian file melalui internet jauh lebih mudah bagi Anda dan juga pengunjung.

Salah satu faktor yang dapat mencegah Anda dari mengompresi file atau membuat proses sangat melelahkan adalah kenyataan bahwa Anda mungkin melakukannya secara manual. Untungnya, PHP hadir dengan banyak ekstensi yang khusus menangani kompresi dan ekstraksi file. Anda dapat menggunakan fungsi yang tersedia di ekstensi ini untuk secara otomatis mengompress file dalam PHP.

Tutorial ini akan mengajarkan Anda cara zip dan unzip (kompres dan ekstrak) file ke dan dari arsip zip di PHP. Anda juga akan belajar cara menghapus atau mengganti nama file dalam arsip tanpa mengekstraknya terlebih dahulu.

Mengompresi File di PHP

Kelas PHP ZipArchive memiliki banyak properti dan metode yang dapat membantu Anda mengompres dan mendekompres semua file Anda.

Kompres File Satu Per Satu

Anda dapat menambahkan file ke arsip zip Anda satu per satu atau menambahkan seluruh direktori sekaligus. Dalam kedua kasus tersebut, langkah pertama adalah membuat instance ZipArchive baru dan kemudian memanggil metode open($filename, [$flags]). Metode ini akan membuka arsip zip baru untuk membaca, menulis, atau modifikasi lainnya. Ada empat nilai valid untuk parameter $flag opsional yang menentukan cara menangani situasi yang berbeda.

  • ZipArchive::OVERWRITE — Tanda ini akan menimpa konten dalam arsip yang ditentukan jika itu sudah ada.
  • ZipArchive::CREATE — Tanda ini akan membuat arsip baru jika belum ada.
  • ZipArchive::EXCL — Tanda ini akan menghasilkan error jika arsip sudah ada.
  • ZipArchive::CHECKCONS — Tanda ini akan memberitahu PHP untuk melakukan pemeriksaan konsistensi tambahan pada arsip dan memberikan error jika gagal.

Anda dapat mengecek dokumentasi metode ini untuk mempelajari tentang kode error yang berbeda yang dikembalikan jika terjadi kegagalan membuka file. Jika file zip dibuka atau berhasil dibuat, metode akan mengembalikan nilai true.

Setelah Anda membuka arsip dengan sukses, Anda dapat menggunakan metode addFile($filename, $localname, $start, $length) untuk menambahkan file apa pun dari path yang diberikan ke arsip Anda. Parameter $filename adalah path file yang ingin Anda tambahkan ke arsip. Parameter $localname pdigunakan untuk menetapkan nama ke file untuk menyimpannya di dalam arsip. Anda dapat memanggil addFile() setiap kali Anda ingin menambahkan file baru ke arsip Anda.

Setelah menambahkan semua file yang diperlukan ke arsip, Anda cukup memanggil metode close() untuk menutupnya dan menyimpan perubahan.

Katakanlah Anda memiliki situs web yang memungkinkan pengguna mengunduh file font untuk font berbeda bersama dengan informasi lisensi untuk menggunakannya. File seperti ini akan menjadi contoh sempurna dari pengarsipan otomatis menggunakan PHP. Kode berikut menunjukkan kepada Anda bagaimana melakukan hal tersebut.

Kita mulai dengan membuat instance ZipArchive dan kemudian menggunakan metode open() untuk membuat arsip kita. Metode addFile() menambahkan file font .ttf aktual dan file lisensi .txt ke arsip.

Anda harus mencatat bahwa file asli berada di dalam direktori fonts/Monoton. Namun, kode PHP menempatkannya langsung di dalam root arsip kita. Anda dapat mengubah struktur direktori serta nama-nama file yang ada dalam arsip.

Mengompresi Banyak File Dari Sebuah Direktori

Menambahkan file satu per satu ke arsip Anda bisa melelahkan setelah beberapa saat. Sebagai contoh, Anda mungkin ingin membuat arsip dari semua file .pdf atau .png dalam sebuah direktori. Metode addGlob($pattern, $flags, $options) akan terbukti sangat membantu dalam kasus ini. Satu-satunya kelemahan dari metode ini adalah Anda kehilangan kendali atas lokasi file individual dalam arsip. Namun, Anda masih dapat mempengaruhi struktur direktori di dalam arsip menggunakan parameter $options. Pilihan diteruskan dalam bentuk array asosiatif.

  • add_path — Nilai yang Anda tetapkan ke add_path diawali dengan path lokal file dalam arsip.
  • remove_path — Nilai yang Anda tetapkan untuk remove_path digunakan untuk menghapus awalan yang cocok dari path file yang berbeda yang ditambahkan ke arsip.
  • remove_all_path — Mengatur nilai remove_all_path ke true akan menghapus semuanya dari path file selain namanya. Dalam hal ini, file ditambahkan ke akar arsip.

Penting untuk diingat bahwa penghapusan path dilakukan sebelum awalan nilai yang ditentukan di add_path.

Potongan kode berikut ini akan menggunakan addGlob() dan semua opsi ini lebih jelas.

Seperti biasa, kita mulai dengan membuat instance ZipArchive dan kemudian menggunakan metode open() untuk membuat arsip kita. Kita juga menentukan nilai yang berbeda untuk kunci add_path dalam array $options setiap saat sebelum memanggil metode addGlob(). Dengan cara ini, kita dapat menangani satu set file tertentu pada satu waktu dan memberikan opsi pengarsipan yang sesuai.

Dalam kasus pertama, kita mengulang semua file .jpg pada direktori lights dan menempatkannya dalam direktori light_wallpapers dalam arsip. Demikian pula, kita mengulangi semua file .ttf di direktori documents dan kemudian menempatkannya di dalam folder bernama font_files dalam arsip kita. Akhirnya, kita melakukan iterasi atas semua file .jpg dan .png di dalam dokumen kita sekaligus dan menempatkannya bersama-sama dalam direktori images.

Seperti yang Anda lihat, nilai-nilai dalam parameter $options berguna dalam mengatur konten di dalam arsip.

Mengekstrak Konten Dari Arsip

Kelas ZipArchive memiliki metode yang disebut extractTo($destination, $entries) untuk mengekstrak isi arsip. Anda dapat menggunakannya untuk mengekstrak semua yang ada di dalam arsip atau hanya beberapa file tertentu. Parameter $entries dapat digunakan untuk menentukan nama file tunggal yang akan diekstraksi, atau Anda dapat menggunakannya untuk mengirimkan array file.

Satu hal penting untuk diingat adalah bahwa Anda perlu menentukan path file yang tepat di dalam arsip untuk mengekstraknya. Misalnya, kita mengarsipkan file font bernama AlegreyaSans-Light.ttf di bagian sebelumnya. File itu disimpan di dalam arsip dalam direktori bernama font_files. Ini berarti bahwa path yang Anda butuhkan untuk ditentukan dalam parameter $entries adalah font_files/AlegreyaSans-Light.ttf dan bukan hanya AlegreyaSans-Light.ttf.

Direktori dan struktur file akan dipertahankan selama proses ekstraksi, dan file akan diekstraksi di direktori masing-masing.

Jika Anda mengabaikan parameter kedua, metode ini akan mengekstrak semua file dalam arsip.

Dapatkan Kontrol Lebih Banyak Atas Arsip

Kelas ZipArchive juga memiliki banyak metode dan properti lain untuk membantu Anda mendapatkan lebih banyak informasi tentang arsip sebelum mengekstrak semua isinya.

Anda dapat menghitung jumlah file dalam arsip menggunakan metode count(). Pilihan lainnya adalah menggunakan properti numFiles. Mereka dapat digunakan untuk melakukan iterasi atas semua file dalam arsip dan hanya mengekstrak yang Anda butuhkan — atau Anda dapat melakukan sesuatu yang lain dengan mereka, seperti menghapusnya dari arsip.

Pada contoh berikut, kita akan menghapus semua file dalam arsip yang mengandung kata Italic. Kode serupa dapat digunakan untuk menghapus semua file yang tidak mengandung kata tertentu. Anda juga dapat melakukan iterasi atas file-file ini dan mengganti kata tertentu dengan yang lain.

Dalam kode di atas, kita menggunakan deleteName() untuk menghapus file individual. Namun, Anda juga dapat menggunakannya untuk menghapus seluruh direktori.

Fungsi yang sama renameName($oldname, $newname) dapat digunakan untuk mengubah nama file apa pun dalam arsip. Anda akan mendapatkan error jika file berjudul $newname sudah ada.

Kesimpulan

Kita telah membahas banyak metode yang sangat bermanfaat dari kelas ZipArchive yang dapat secara otomatis membuat kompresi dan ekstraksi file dalam PHP. Anda sekarang pastinya dapat memampatkan file individual atau grup sekaligus, berdasarkan kriteria Anda sendiri. Demikian pula, Anda pastinya dapat mengekstrak file tertentu dari arsip tanpa memengaruhi konten lain.

Dengan bantuan count() dan numFiles, Anda akan mendapatkan lebih banyak kontrol atas file individual, dan mengganti nama atau menghapusnya akan sangat mudah. Anda harus melihat dokumentasi setidaknya sekali untuk membaca tentang lebih banyak fungsi-fungsi seperti itu.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.