Membuat Patch & Extract Zip di Codeigniter

Artikel kali ini saya akan coba membahas bagaiamana menggunakan Codeigniter untuk melakukan extract file ber extension ZIP. Sebelumnya beberapa waktu yang lalu saya pernah membuat sebuah aplikasi dimana setiap bulannya ada penambahan pada setiap module, baik itu berupa perubahan Bugs, perbaikan interface dll. Terkadang cukup susah ketika client yang saya miliki tidak dapat melakukan update ke aplikasi berbasis web, dikarenakan mereka bukanlah orang-orang yang mengerti Programming.

Jadi, untuk mengurangi keterbatasan ini, saya mencoba membuat alternatif yaitu upload PATCH pada aplikasi yang saya buat. nah, tentunya saya harus membuat file compress untuk memperkecil ukuran upload, namun file yang di extract memiliki file yang sama dengan update module dan lain sebagainya yang saya miliki.

disini saya mencoba membuat sebuah menu upload patch, lalu saya membuat sebuah code HTML untuk upload Filenya,


<?php echo form_open_multipart('admin/patch_update/file_upload');?>
<input type="file" name="userfile" size="20" />

<input class="btn btn-info" type="submit" value="Upload dan Patch" />
<?php echo form_close();?>

Keterangan :
1. form open multipart => di gunakan untuk melakukan upload data. biasanya kalau menggunakan form standard menggunaka n enctype=”multipart/form-data”.

2. admin/patch_update/file_upload => disini anda dapat mengganti URI sesuai method yang anda miliki. jadi, disini masih default URI bawaan aplikasi saya..hehee

3. HTML Upload => nantinya client/user akan mengupload file Zip yang saya punya lalu otomatis dilakukan extract sesuai tujuan tertentu yang sudah saya berikan.

Sekarang saya akan membuat Controller Patch_update.php


<?php
class Patch_update extends CI_Controller{
public function __construct()
{
parent::__construct();
$this--->load->helper('url');
}

	public function index()
	{
 	   $this->load->view('patch_upload');
 	}

	function file_upload()
	{
		$config['upload_path'] = './files_patch/';
		$config['allowed_types'] = 'zip';
		$config['max_size']	= '10000';
		$this->load->library('upload', $config);
		if ( ! $this->upload->do_upload())
		{
			$error = $this->upload->display_errors();
			Template::set_message($error, 'error');
			redirect( site_url('/admin/patch_update') );
		}
		else
		{
			$data = array('upload_data' => $this->upload->data());

			if (stristr(PHP_OS, 'WIN')) {
  			#windows
 		        $zip = new ZipArchive;
 			$file = $data['upload_data']['full_path'];
 			chmod($file,0755);
			if ($zip->open($file) === TRUE) {
    				$zip->extractTo('./prosite/modules/');
    				$zip->close();
    				@unlink($config['upload_path'].'/'.$data['upload_data']['file_name']);
					Template::set_message('Patch Sudah Berhasil.', 'success');
					redirect( site_url('/admin/patch_update') );
			} else {
    				Template::set_message('Failed..', 'error');
			}
 			#LINUX

			 } else {
			   $this->unZipOnLinux($data['upload_data']['file_name'] , './prosite/modules/');
			 }

		}
		$this->load->view('patch_upload');
	}
}//End class
?>

Petunjuk source diatas,
1. Buatkan files_patch folder pada folder Root. sehingga file Zip yang di upload akan masuk sesuai foldernya yaitu bertipe ZIP.
2. $zip = new ZipArchive; sudah bawaan PHP, jadi anda tetap dapat menggunakannya pada CI.
3. $zip->extractTo , merupakan extract dengan operating system windows.
4. $this->unZipOnLinux , merupakan extract dengan operating system Linux. ( harus kita buatkan).
5. prosite/modules , disini file hasil extract yang saya upload tadi di tujukan. karena memang saya ingin melakukan perbaikan dan penambahan file-file didalam folder modules ini.

Disini, kita sudah membuat sebuah COntroller dan sebuah Folder Files_patch, sekarang saya perlu menambahkan sebuah function untuk versi extract linux nya. silahkan anda tambahkan function berikut ini pada Controller tadi,

function unZipOnLinux($sourceFileName,$destinationPath){
 		  $directoryPos = strrpos($sourceFileName,'/');
		  $directory = substr($sourceFileName,0,$directoryPos+1);
		  $dir = opendir( $directory );
		  $info = pathinfo($sourceFileName);
		  if ( strtolower($info['extension']) == 'zip' ) {
		   system('unzip -q '.$sourceFileName .'  -d '. $destinationPath);
		   Template::set_message('file Extract!!!.', 'success');
		  }
		  closedir( $dir );
    }

Ok, sekarang semua sudah kita buat sesuai peruntukkannya. sehingga bentuk source code keseluruhannya seperti berikut ini ,

<?php
class Patch_update extends CI_Controller{
public function __construct()  	{
parent::__construct();
$this--->load->helper('url');
}

	public function index()
	{
 	   $this->load->view('patch_upload');
 	}

	function file_upload()
	{
		$config['upload_path'] = './files_patch/';
		$config['allowed_types'] = 'zip';
		$config['max_size']	= '10000';
		$this->load->library('upload', $config);
		if ( ! $this->upload->do_upload())
		{
			$error = $this->upload->display_errors();
			Template::set_message($error, 'error');
			redirect( site_url('/admin/patch_update') );
		}
		else
		{
			$data = array('upload_data' => $this->upload->data());

			if (stristr(PHP_OS, 'WIN')) {
  			#windows
 		    $zip = new ZipArchive;
 			$file = $data['upload_data']['full_path'];
 			chmod($file,0755);
			if ($zip->open($file) === TRUE) {
    				$zip->extractTo('./prosite/modules/');
    				$zip->close();
    				@unlink($config['upload_path'].'/'.$data['upload_data']['file_name']);
					Template::set_message('Patch Sudah Berhasil.', 'success');
					redirect( site_url('/admin/patch_update') );
			} else {
    				Template::set_message('Failed..', 'error');
			}
 			#LINUX

			 } else {
			   $this->unZipOnLinux($data['upload_data']['file_name'] , './prosite/modules/');
			 }

		}
		$this->load->view('patch_upload');
	}

	function unZipOnLinux($sourceFileName,$destinationPath){
 		  $directoryPos = strrpos($sourceFileName,'/');
		  $directory = substr($sourceFileName,0,$directoryPos+1);
		  $dir = opendir( $directory );
		  $info = pathinfo($sourceFileName);
		  if ( strtolower($info['extension']) == 'zip' ) {
		   system('unzip -q '.$sourceFileName .'  -d '. $destinationPath);
		   Template::set_message('file Extract!!!.', 'success');
		  }
		  closedir( $dir );
    }

}//end class

?>

Conclusion

Dengan Memanfaatkan ZipArchive tadi, saya sudah dapat memecahkan masalah yang saya alami pada saat update patch untuk aplikasi berbasis Web yang saya miliki. Anda dapat mengembangkan sesuai keinginan atau kebutuhan tanpa ada larangan..hehehe. Semoga artikel yang saya buat bermanfaat untuk anda.. šŸ™‚

Programmer Idiot memberi salam…

10 thoughts on “Membuat Patch & Extract Zip di Codeigniter

    1. hmm…kalau aplikasi zip kan biasanya OS sudah punya mengikut sertakan…kalau versi Rar sementara ini belum ada untuk librarynya. soalnya masih supporting berextension ZIP. prosesnya kayak kita upload ke server hosting aja ed..:)

    1. Untuk Windows dan Linux tentunya bisa, if (stristr(PHP_OS, ‘WIN’)) { >>>>> mengindikasikan jika ditemukan Windows maka, otomatis script dijalankan untuk windows, sedangkan ELSE akan menjalankan versi LINUX.

  1. mohon bantuannya,
    untuk ekstrak di linux kok error Severity: Warning –> opendir(u): failed to open dir: No such file or directory. script yang ini $dir = opendir( $directory );
    bales di email ya mas.

Leave a comment