Bagaimana Cara Zip dan Unzip File di Codelgeniter
() translation by (you can also view the original English article)
Separuh pertama tutorial ini menjelaskan cara-cara berbeda agar Anda bisa membuat suatu file zip dengan menggunakan Codelgeniter API built-in. Akan kita lihat bagaimana cara membuat dan menyimpan file zip di server dan bagaimana Anda membuatnya juga bisa diunduh oleh pengguna akhir.
Separuh keduanya berisi pembahasan cara Anda unzip filenya. Untuk mendemonstrasikan hal itu, kita akan membuat halaman sesuaian (custom) yang mengizinkan pengguna mengunggah file zip yang akan diekstrak ke server setelah pengunggahan file berhasil. Untuk mendapatkan fungsionalitas yang diinginkan, ekstensi ZipArchive PHP datang dan membantu kita!
Sebelum melanjutkan dan secara serius mendalami hal-hal pengembangan, saya akan menyebutkan file-file yang akan kita kembangkan sepanjang tutorial ini:
-
application/controllers/Zip.php
: ini adalah file controller yang mendemonstrasikan berbagai cara Anda bisa membuat file zip. -
application/controllers/Unzip.php
: Suatu file controller yang berisi kode yang digunakan untuk unzip file yang diunggah pengguna. -
application/views/file_upload_form.php
: File tampilan yang menangani kode form pengunggahan file HTML yang cukup dasar. -
application/views/file_upload_result.php
: File tampilan yang menunjukkan hasil file yang diunggah pengguna; pada dasarnya memberitahu Anda bahwa filenya berhasil di-unzip. -
application/libraries/Extractor.php
: File ini mendemonstrasikan konsep pustaka sesuaian (custom library) di Codelgeniter.
Jika semuanya sudah tersedia, kita siap melangkah ke bagian berikutnya!
Bagaimana Men-Zip File?
Lanjutkan dengan membuat suatu file application/controllers/Zip.php
dengan konten berikut.
1 |
<?php
|
2 |
// application/controllers/Zip.php
|
3 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
4 |
|
5 |
class Zip extends CI_Controller { |
6 |
private function _load_zip_lib() |
7 |
{
|
8 |
$this->load->library('zip'); |
9 |
}
|
10 |
|
11 |
private function _archieve_and_download($filename) |
12 |
{
|
13 |
// create zip file on server
|
14 |
$this->zip->archive(FCPATH.'/uploads/'.$filename); |
15 |
|
16 |
// prompt user to download the zip file
|
17 |
$this->zip->download($filename); |
18 |
}
|
19 |
|
20 |
public function data() |
21 |
{
|
22 |
$this->_load_zip_lib(); |
23 |
|
24 |
$this->zip->add_data('name.txt', 'Sajal Soni'); |
25 |
$this->zip->add_data('profile.txt', 'Web Developer'); |
26 |
|
27 |
$this->_archieve_and_download('my_info.zip'); |
28 |
}
|
29 |
|
30 |
public function data_array() |
31 |
{
|
32 |
$this->_load_zip_lib(); |
33 |
|
34 |
$files = array( |
35 |
'name.txt' => 'Sajal Soni', |
36 |
'profile.txt' => 'Web Developer' |
37 |
);
|
38 |
|
39 |
$this->zip->add_data($files); |
40 |
|
41 |
$this->_archieve_and_download('my_info.zip'); |
42 |
}
|
43 |
|
44 |
public function data_with_subdirs() |
45 |
{
|
46 |
$this->_load_zip_lib(); |
47 |
|
48 |
$this->zip->add_data('info/name.txt', 'Sajal Soni'); |
49 |
$this->zip->add_data('info/profile.txt', 'Web Developer'); |
50 |
|
51 |
$this->_archieve_and_download('my_info.zip'); |
52 |
}
|
53 |
|
54 |
public function files() |
55 |
{
|
56 |
$this->_load_zip_lib(); |
57 |
|
58 |
// pass second argument as TRUE if want to preserve dir structure
|
59 |
$this->zip->read_file(FCPATH.'/uploads/1.jpg'); |
60 |
$this->zip->read_file(FCPATH.'/uploads/2.jpg'); |
61 |
|
62 |
$this->_archieve_and_download('images.zip'); |
63 |
}
|
64 |
|
65 |
public function dir() |
66 |
{
|
67 |
$this->_load_zip_lib(); |
68 |
|
69 |
// pass second argument as FALSE if want to ignore preceding directories
|
70 |
$this->zip->read_dir(FCPATH.'/uploads/images/'); |
71 |
|
72 |
$this->_archieve_and_download('dir_images.zip'); |
73 |
}
|
74 |
}
|
Ini adalah file controller yang cukup standar dan Anda sudah akrab dengannya. File ini menangani beberapa metode, dan tiap metodenya menunjukkan Anda cara berbeda untuk membuat file zip.
Terlepas dari itu, file tersebut menyediakan dua metode privat, _load_zip_lib
dan _archieve_and_download
, yang dipanggil dari metode-metode yang lainnya. Tentu saja, Anda tidak perlu mengimplementasikan metode-metode tersebut, tetapi kita baru saja merefaktor kodenya sehingga Anda tidak harus mengulangi kode yang sama di metode lainnya. Pertama mari melihat kedua metode tersebut.
Berikut adalah penampakan metode _load_zip_lib
.
1 |
private function _load_zip_lib() |
2 |
{
|
3 |
$this->load->library('zip'); |
4 |
}
|
Metode itu memuat pustaka zip internal framework Codelgeniter supaya Anda bisa menggunakan fitur-fitur pustaka tersebut di sepanjang kodenya. Sekarang Anda bisa mengakses pustaka zip dengan konvensi $this->zip
.
Berikutnya, ada metode _archieve_and_download
.
1 |
private function _archieve_and_download($filename) |
2 |
{
|
3 |
// create zip file on server
|
4 |
$this->zip->archive(FCPATH.'/uploads/'.$filename); |
5 |
|
6 |
// prompt user to download the zip file
|
7 |
$this->zip->download($filename); |
8 |
}
|
Sebagaimana kita telah memuat pustaka zip, Anda bisa menggunakan metode yang disediakannya. Metode archive memungkinkan Anda membuat file zip sebagai path yang dijadikan argumen pertama. Di sisi lain, metode pengunduhan mengarahkan pengguna untuk mengunduh file.
Jangan khawatir jika Anda bertanya-tanya tentang konten file zip kami, karena kita akan melihatnya sebentar lagi.
Semua sudah siap, jadi kita ambil ancang-ancang untuk bergerak!
Mari ambil kode metode data
. Metode ini menunjukkan cara membuat file dengan cepat dan membungkusnya dalam file zip.
1 |
public function data() |
2 |
{
|
3 |
$this->_load_zip_lib(); |
4 |
|
5 |
$this->zip->add_data('name.txt', 'Sajal Soni'); |
6 |
$this->zip->add_data('profile.txt', 'Web Developer'); |
7 |
|
8 |
$this->_archieve_and_download('my_info.zip'); |
9 |
}
|
Untuk memulai, kita memanggil metode _load_zip_lib
yang memuat pustaka zip. Berikutnya, kita telah menggunakan metode add_data
kelas zip yang memungkinkan Anda menciptakan dan mengisinya dengan konten pada waktu yang sama! Tentu saja ditambahkan ke arsipnya juga!
Argumen pertama haruslah nama filenya, dan argumen kedua menangani konten yang masuk ke dalam filenya.
Sebagaimana bisa dilihat, kita telah menambahkan dua file, name.txt
dan profile.txt
, dengan sejumlah konten demo. Akhirnya, kita memanggil _archieve_and_download
dengan my_info.zip
sebagai argumen metode tersebut. Apa yang dilakukannya?
- Akan membuat suatu file zip
my_info.zip
di bawah direktori unggahan Anda. - Akan meminta pengguna untuk mengunduh file, dan nama yang dengannya filenya akan disimpan adalah
my_info.zip
.
Jadi pastikan Anda sudah membuat direktori uploads
di root situs Anda. Pastikan juga Anda membuatnya bisa ditulisi oleh pengguna server web. Sekarang, lanjutkan dan jalankan “http://my-codeingiter-site/zip/data” untuk melihat aksinya.
Jika Anda ada masalah, silakan bertanya pada saya di komentar!
Berikutnya adalah metode data_array
.
1 |
public function data_array() |
2 |
{
|
3 |
$this->_load_zip_lib(); |
4 |
|
5 |
$files = array( |
6 |
'name.txt' => 'Sajal Soni', |
7 |
'profile.txt' => 'Web Developer' |
8 |
);
|
9 |
|
10 |
$this->zip->add_data($files); |
11 |
|
12 |
$this->_archieve_and_download('my_info.zip'); |
13 |
}
|
Metode ini identik dengan yang baru saja kita bahas, kecuali bahwa kita menyediakan sekumpulan file untuk metode add_data
alih-alih file-file tersendiri.
Berikutnya, mari mengambil kode metode data_with_subdirs
.
1 |
public function data_with_subdirs() |
2 |
{
|
3 |
$this->_load_zip_lib(); |
4 |
|
5 |
$this->zip->add_data('info/name.txt', 'Sajal Soni'); |
6 |
$this->zip->add_data('info/profile.txt', 'Web Developer'); |
7 |
|
8 |
$this->_archieve_and_download('my_info.zip'); |
9 |
}
|
Untuk berjaga-jaga jika Anda ingin mengorganisasikan file-file Anda dalam direktori tertentu, metode add_data
memungkinkan Ana membuatnya juga. Keluaran yang dihasilkan metode di atas tidak ada bedanya kecuali file name.txt
dan profile.txt
akan dimasukkan dalam direktori info
.
Meskipun metode add_data
menyediakan fitur bagus yang memungkinkan Anda membuat file dengan cepat, lebih sering dari tidak Anda akan membutuhkan untuk men-zip file-file yang ada di server. Bagaimanapun itulah tepatnya topik yang akan dibahas dalam beberapa metode ke depan.
Mari kita lihat dengan cepat bagaimana penampakan metode files
kita berikutnya. Akan dibuat suatu zip file-file di bawah direktori uploads
.
1 |
public function files() |
2 |
{
|
3 |
$this->_load_zip_lib(); |
4 |
|
5 |
// pass second argument as TRUE if want to preserve dir structure
|
6 |
$this->zip->read_file(FCPATH.'/uploads/1.jpg'); |
7 |
$this->zip->read_file(FCPATH.'/uploads/2.jpg'); |
8 |
|
9 |
$this->_archieve_and_download('images.zip'); |
10 |
}
|
Tujuan metode read_file
adalah membaca file yang ada di server dan menambahkannya ke archive. Sebagaimana bisa dilihat, kita menambahkan dua file 1.jpg
dan 2.jpg
ke archive. Tentu saja dua file tersebut harus ada di bawah direktori uploads
di root situs Anda.
Jika Anda memasukkan TRUE
sebagai argumen kedua metode read_file
, file zip yang dihasilkan mempertahankan struktur direktoi yang tepat yang filenya ditempatkan di situ.
Cobalah menjalankan http://my-codeingiter-site/zip/files dan lihat hasilnya!
Metode terakhir di segmen ini adalah metode dir
yang akan memuat suatu arsip zip keseluruhan direktori.
1 |
public function dir() |
2 |
{
|
3 |
$this->_load_zip_lib(); |
4 |
|
5 |
// pass second argument as FALSE if want to ignore preceding directories
|
6 |
$this->zip->read_dir(FCPATH.'/uploads/images/'); |
7 |
|
8 |
$this->_archieve_and_download('dir_images.zip'); |
9 |
}
|
Anda bisa menggunakan metode read_dir
jika ingin membuat arsip zip keseluruhan direktori alih-alih file-file tertentu. Dalam contoh kita di atas, yang akan dibuat adalah file dir_images.zip
yang berisi semua file di bawah direktori /uploads/images/
.
Hal yang penting diingat di sini adalah bahwa keseluruhan struktur direktori akan dipertahankan secara default dalam file zipnya. Tetapi jika Anda ingin mengabaikannya masukkan saja FALSE
sebagai argumen kedua metode read_dir
. Dalam hal ini, yang akan dibuat hanyalah direktori images
dalam file zipnya.
Maka itulah akhir cerita tentang cara membuat arsip zip dengan menggunakan berbagai metode yang disediakan oleh kelas zip internal.
Bagaimana Cara Unzip File?
Sayangnya, tidak ada pustaka internal Codelgeniter yang memungkinkan kita meng-unzip arsip zip. Tetapi ekstensi ZipArchive PHP membuatnya jadi mudah, sebagaimana kita lihat sebentar lagi.
Kita akan membuat contoh yang lumayan sederhana untuk mendemonstrasikan cara meng-unzip fle-file yang diunggah pengguna.
Mulailah dengan membuat fle application/controllers/Unzip.php
dengan konten sebagai berikut.
1 |
<?php
|
2 |
// application/controllers/Unzip.php
|
3 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
4 |
|
5 |
class Unzip extends CI_Controller { |
6 |
public function __construct() |
7 |
{
|
8 |
parent::__construct(); |
9 |
$this->load->helper(array('form', 'url')); |
10 |
}
|
11 |
|
12 |
public function index() |
13 |
{
|
14 |
$this->load->view('file_upload_form'); |
15 |
}
|
16 |
|
17 |
public function upload() |
18 |
{
|
19 |
$config['upload_path'] = './uploads/'; |
20 |
$config['allowed_types'] = 'zip'; |
21 |
|
22 |
$this->load->library('upload', $config); |
23 |
|
24 |
if ( ! $this->upload->do_upload('zip_file')) |
25 |
{
|
26 |
$params = array('error' => $this->upload->display_errors()); |
27 |
}
|
28 |
else
|
29 |
{
|
30 |
$data = array('upload_data' => $this->upload->data()); |
31 |
$full_path = $data['upload_data']['full_path']; |
32 |
|
33 |
/**** without library ****/
|
34 |
$zip = new ZipArchive; |
35 |
|
36 |
if ($zip->open($full_path) === TRUE) |
37 |
{
|
38 |
$zip->extractTo(FCPATH.'/uploads/'); |
39 |
$zip->close(); |
40 |
}
|
41 |
|
42 |
$params = array('success' => 'Extracted successfully!'); |
43 |
}
|
44 |
|
45 |
$this->load->view('file_upload_result', $params); |
46 |
}
|
47 |
}
|
Kita juga membuat templat tampilannya, kemudian kita lihat bagaimana itu bekerja bersama.
Buat file templat tampilan application/views/file_upload_form.php
dengan konten sebagai berikut.
1 |
<?php
|
2 |
// application/views/file_upload_form.php
|
3 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
4 |
?><!DOCTYPE html>
|
5 |
<html lang="en"> |
6 |
<head>
|
7 |
<meta charset="utf-8"> |
8 |
<title>Welcome to CodeIgniter</title> |
9 |
|
10 |
<style type="text/css"> |
11 |
|
12 |
::selection { background-color: #E13300; color: white; } |
13 |
::-moz-selection { background-color: #E13300; color: white; } |
14 |
|
15 |
body { |
16 |
background-color: #fff; |
17 |
margin: 40px; |
18 |
font: 13px/20px normal Helvetica, Arial, sans-serif; |
19 |
color: #4F5155; |
20 |
}
|
21 |
|
22 |
a { |
23 |
color: #003399; |
24 |
background-color: transparent; |
25 |
font-weight: normal; |
26 |
}
|
27 |
|
28 |
h1 { |
29 |
color: #444; |
30 |
background-color: transparent; |
31 |
border-bottom: 1px solid #D0D0D0; |
32 |
font-size: 19px; |
33 |
font-weight: normal; |
34 |
margin: 0 0 14px 0; |
35 |
padding: 14px 15px 10px 15px; |
36 |
}
|
37 |
|
38 |
code { |
39 |
font-family: Consolas, Monaco, Courier New, Courier, monospace; |
40 |
font-size: 12px; |
41 |
background-color: #f9f9f9; |
42 |
border: 1px solid #D0D0D0; |
43 |
color: #002166; |
44 |
display: block; |
45 |
margin: 14px 0 14px 0; |
46 |
padding: 12px 10px 12px 10px; |
47 |
}
|
48 |
|
49 |
#body { |
50 |
margin: 0 15px 0 15px; |
51 |
}
|
52 |
|
53 |
p.footer { |
54 |
text-align: right; |
55 |
font-size: 11px; |
56 |
border-top: 1px solid #D0D0D0; |
57 |
line-height: 32px; |
58 |
padding: 0 10px 0 10px; |
59 |
margin: 20px 0 0 0; |
60 |
}
|
61 |
|
62 |
#container { |
63 |
margin: 10px; |
64 |
border: 1px solid #D0D0D0; |
65 |
box-shadow: 0 0 8px #D0D0D0; |
66 |
}
|
67 |
|
68 |
div { |
69 |
padding: 10px; |
70 |
}
|
71 |
|
72 |
.error { |
73 |
color: #F00; |
74 |
}
|
75 |
|
76 |
.success { |
77 |
color: #00F; |
78 |
}
|
79 |
</style>
|
80 |
</head>
|
81 |
<body>
|
82 |
|
83 |
<div id="container"> |
84 |
<h1>Upload File</h1> |
85 |
|
86 |
<div id="body"> |
87 |
<div class="success"><?php if (isset($success)) {echo $success;}?></div> |
88 |
<div class="error"><?php if (isset($error)) {echo $error;}?></div> |
89 |
|
90 |
<?php echo form_open_multipart('unzip/upload');?> |
91 |
<div>
|
92 |
<input name="zip_file" type="file"/> |
93 |
</div>
|
94 |
<div>
|
95 |
<input type="submit" value="Upload Zip File" /> |
96 |
</div>
|
97 |
</form>
|
98 |
</div>
|
99 |
</div>
|
100 |
|
101 |
</body>
|
102 |
</html>
|
Dibuatnya suatu form unggahan file sederhana supaya pengguna bisa mengunggah file zip! Perhatikan bahwa saya membuatnya seminimal mungkin demi kesederhanaan.
Berikutnya, mari membuat file templat tampilan application/views/file_upload_result.php
.
1 |
<?php
|
2 |
// application/views/file_upload_result.php
|
3 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
4 |
?><!DOCTYPE html>
|
5 |
<html lang="en"> |
6 |
<head>
|
7 |
<meta charset="utf-8"> |
8 |
<title>Welcome to CodeIgniter</title> |
9 |
|
10 |
<style type="text/css"> |
11 |
|
12 |
::selection { background-color: #E13300; color: white; } |
13 |
::-moz-selection { background-color: #E13300; color: white; } |
14 |
|
15 |
body { |
16 |
background-color: #fff; |
17 |
margin: 40px; |
18 |
font: 13px/20px normal Helvetica, Arial, sans-serif; |
19 |
color: #4F5155; |
20 |
}
|
21 |
|
22 |
a { |
23 |
color: #003399; |
24 |
background-color: transparent; |
25 |
font-weight: normal; |
26 |
}
|
27 |
|
28 |
h1 { |
29 |
color: #444; |
30 |
background-color: transparent; |
31 |
border-bottom: 1px solid #D0D0D0; |
32 |
font-size: 19px; |
33 |
font-weight: normal; |
34 |
margin: 0 0 14px 0; |
35 |
padding: 14px 15px 10px 15px; |
36 |
}
|
37 |
|
38 |
code { |
39 |
font-family: Consolas, Monaco, Courier New, Courier, monospace; |
40 |
font-size: 12px; |
41 |
background-color: #f9f9f9; |
42 |
border: 1px solid #D0D0D0; |
43 |
color: #002166; |
44 |
display: block; |
45 |
margin: 14px 0 14px 0; |
46 |
padding: 12px 10px 12px 10px; |
47 |
}
|
48 |
|
49 |
#body { |
50 |
margin: 0 15px 0 15px; |
51 |
}
|
52 |
|
53 |
p.footer { |
54 |
text-align: right; |
55 |
font-size: 11px; |
56 |
border-top: 1px solid #D0D0D0; |
57 |
line-height: 32px; |
58 |
padding: 0 10px 0 10px; |
59 |
margin: 20px 0 0 0; |
60 |
}
|
61 |
|
62 |
#container { |
63 |
margin: 10px; |
64 |
border: 1px solid #D0D0D0; |
65 |
box-shadow: 0 0 8px #D0D0D0; |
66 |
}
|
67 |
|
68 |
div { |
69 |
padding: 10px; |
70 |
}
|
71 |
|
72 |
.error { |
73 |
color: #F00; |
74 |
}
|
75 |
|
76 |
.success { |
77 |
color: #00F; |
78 |
}
|
79 |
</style>
|
80 |
</head>
|
81 |
<body>
|
82 |
|
83 |
<div id="container"> |
84 |
<h1>Upload File Result</h1> |
85 |
|
86 |
<div id="body"> |
87 |
<div class="success"><?php if (isset($success)) {echo $success;}?></div> |
88 |
<div class="error"><?php if (isset($error)) {echo $error;}?></div> |
89 |
<a href="<?php echo site_url('unzip/index'); ?>"><< Back to File Uploader</a> |
90 |
</div>
|
91 |
</div>
|
92 |
|
93 |
</body>
|
94 |
</html>
|
Sekalinya filenya diunggah dan diekstrak, pengguna akan ditunjukkan templat di atas.
Sekarang, mari kita kembali ke controller dan menelusuri tiap metodenya.
Di constructor controller kita, telah dimuat form dan url internal bantuan Codelgeniter, sehingga kita bisa menggunakan fungsi bantuan seperti form_open_multipart
, site_url
dan semacamnya.
Berikutnya, mari melihat metode index
.
1 |
public function index() |
2 |
{
|
3 |
$this->load->view('file_upload_form'); |
4 |
}
|
Apakah ini butuh penjelasan? Ini memanggil tampilan file_upload_form
dan me-render halamannya. Jadi ketika Anda mengakses http://my-codeingiter-site/unzip akan ditampilkan form pengunggahan file sederhana sebagaimana ditampilkan di bawah ini.
Perhatikan juga bahwa action form kita adalah unzip/upload
yang datanya akan dikirimkan ke situ. Kita telah menggunakan bantuan form_open_multipart
untuk menghasilkan tag form multibagian!



Berikutnya, kita harus mengimplementasikan metode action upload
yang akan menangani pengunggahan file dan ekstraksi. Ambil kodenya dari controller Unzip.php
.
1 |
public function upload() |
2 |
{
|
3 |
$config['upload_path'] = './uploads/'; |
4 |
$config['allowed_types'] = 'zip'; |
5 |
|
6 |
$this->load->library('upload', $config); |
7 |
|
8 |
if ( ! $this->upload->do_upload('zip_file')) |
9 |
{
|
10 |
$params = array('error' => $this->upload->display_errors()); |
11 |
}
|
12 |
else
|
13 |
{
|
14 |
$data = array('upload_data' => $this->upload->data()); |
15 |
$full_path = $data['upload_data']['full_path']; |
16 |
|
17 |
$zip = new ZipArchive; |
18 |
|
19 |
if ($zip->open($full_path) === TRUE) |
20 |
{
|
21 |
$zip->extractTo(FCPATH.'/uploads/'); |
22 |
$zip->close(); |
23 |
}
|
24 |
|
25 |
$params = array('success' => 'Extracted successfully!'); |
26 |
}
|
27 |
|
28 |
$this->load->view('file_upload_result', $params); |
29 |
}
|
Jika Anda akrab dengan pengunggahan file di Codelgeniter, kodenya tidak akan tampak asing bagi Anda. Bagi yang belum akrab, tidak ada yang perlu dikhawatirkan karena API pengunggahan di Codelgeniter menjadikannya mudah.
Kode berikut memuat pustaka unggahan dengan beberapa konfigurasi awal yang disediakan oleh variabel array $config
.
1 |
$this->load->library('upload', $config); |
Kita telah mengonfigurasinya sehingga file yang diunggah akan ditempatkan di bawah direktori uploads
di root aplikasinya, dan pengguna hanya akan diizinkan untuk mengunggah file-file zip.
Berikutnya, kita telah mengecek apakah pengunggahan filenya gagal, jika seperti itu maka kita akan mengambil pesan kesalahan yang bermanfaat dan memberikannya ke $params
supaya bisa ditampilkan dalam templatnya.
1 |
$params = array('error' => $this->upload->display_errors()); |
Dalam hal ini, jika file berhasil diunggah, maka langkah berikutnya adalah mendapatkan path file yang diunggah.
1 |
$data = array('upload_data' => $this->upload->data()); |
2 |
$full_path = $data['upload_data']['full_path']; |
Akhirnya, kita menginstantiasi suatu objek ZipArchive, membuka file zip kita, dan mengekstraknya ke direktori uploads
.
1 |
$zip = new ZipArchive; |
2 |
|
3 |
if ($zip->open($full_path) === TRUE) |
4 |
{
|
5 |
$zip->extractTo(FCPATH.'/uploads/'); |
6 |
$zip->close(); |
7 |
}
|
Bukankah itu langsung ke tujuan?
Satu-satunya yang tersisa adalah memanggil tampilan file_upload_result
, dan berikut adalah penampakannya seharusnya!



Jadi, itulah bagian lain dari ceritanya!
Refaktor Unzipping Code ke Suatu Pustaka
Anda mungkin sudah menyadari bahwa metode upload
mengandung kode ZipArchive yang mengekstrak file yang diunggah. Bagaimana jika Anda butuh menggunakan kode tersebut di berbagai tempat? Mungkin Anda tergoda untuk copy paste kodenya sesuai kebutuhan.
Bukan demikian, ada cara yang lebih baik yang Codelgeniter mengizinkan Anda melakukan sentralisasi kode yang akan digunakan di sepanjang aplikasi. Anda bisa membuat suatu pustaka sesuaian (custom library).
Mulailah dengan membuat suatu file application/libraries/Extractor.php
dengan konten sebagai berikut.
1 |
<?php
|
2 |
// application/libraries/Extractor.php
|
3 |
class Extractor { |
4 |
private $CI = NULL; |
5 |
private $zip = NULL; |
6 |
|
7 |
public function __construct($params = array()) |
8 |
{
|
9 |
$this->CI =& get_instance(); |
10 |
$this->zip = new ZipArchive; |
11 |
}
|
12 |
|
13 |
public function extract($source_file, $dest_dir) |
14 |
{
|
15 |
if ($this->zip->open($source_file) === TRUE) |
16 |
{
|
17 |
$this->zip->extractTo($dest_dir); |
18 |
$this->zip->close(); |
19 |
}
|
20 |
}
|
21 |
}
|
Sekarang lanjutkan dengan mengganti metode upload
di controller Unzip.php
Anda dengan yang berikut ini.
1 |
public function upload() |
2 |
{
|
3 |
$config['upload_path'] = './uploads/'; |
4 |
$config['allowed_types'] = 'zip'; |
5 |
|
6 |
$this->load->library('upload', $config); |
7 |
|
8 |
if ( ! $this->upload->do_upload('zip_file')) |
9 |
{
|
10 |
$params = array('error' => $this->upload->display_errors()); |
11 |
}
|
12 |
else
|
13 |
{
|
14 |
$data = array('upload_data' => $this->upload->data()); |
15 |
$full_path = $data['upload_data']['full_path']; |
16 |
|
17 |
$this->load->library('extractor'); |
18 |
$this->extractor->extract($full_path, FCPATH.'/uploads/'); |
19 |
$params = array('success' => 'Extracted successfully!'); |
20 |
}
|
21 |
|
22 |
$this->load->view('file_upload_result', $params); |
23 |
}
|
Sebagaimana bisa Anda lihat, kita telah memuat custom library dan menggunakannya untuk mengekstrak kontennya!
1 |
$this->load->library('extractor'); |
2 |
$this->extractor->extract($full_path, FCPATH.'/uploads/'); |
Cukup keran, kan?
Dan ya, itulah akhir artikel ini.
Kesimpulan
Saya harap Anda menikmati artikel ini, yang kita mulai dengan mengeksplorasi pustaka zip inti framework Codelgeniter dan beragam cara Anda bisa membuat arsip zip. Di bagian kedua, saya menjelaskan bagaimana Anda bisa meng-unzip file-file unggahan pengguna dengan menggunakan ekstensi ZipArchive PHP.
Dalam prosesnya, kita juga mendapat kesempatan mengonversi kode kita jadi pustaka Codelgeniter custom, dan itu boleh dibilang semacam buah ceri di puncak!
Beritahu saya jika Anda memiliki pertanyaan dan saran yang bisa Anda sampaikan dengan menggunakan umpan di bawah ini.