Skip to content

Posts tagged ‘bug’

10
Dec

Bug Library ZIP di CodeIgniter

Kemarin saya buat modul untuk mengkompresi file2 diserver dan di download. Ceritanya sih, mau buat seperti kayak file manager, jadi select multiple file trus di zip dan otomatis di donlod. Sebelum kemana2, CI yang aku gunakan adalah versi 1.6.3.

Enaknya kalo pake CI nih, kalo untuk fitur semacam itu, proses yang aku lakukan cukup sampe di level class controller aja. jadi setelah selesai gak perlu load halaman htmlnya lagi. Mungkin kalo masih pake coding PHP biasa sih, begitu pilih file nya, trus di submit ke URL yang mroses, otomatis halamannya akan render lagi, sekaligus mroses inputan dari submit tadi.

Pada awalnya waktu men-zip multiple file, proses berhasil dengan sempurna. Dengan menggunakan metode

$this->zip->read_file($parentpath.$namafile);

File tersebut langsung dibaca isinya dan dimasukan dalam archive zip sementara, menunggu aksi terakhir apakah nanti di download

$this->zip->download($down_namafile);

apa disimpan

$this->zip->archive($zip_namafile);

Sekarang yang menjadi permasalahan adalah pada waktu item yang dipilih adalah sebuah direktori, memang benar fungsi ini menjalankan tugasnya membaca isi direktori lalu menjadikan dalam satu zip file.

Namun tugas itu dijalankan tidak cukup baik. Misal begini, ada direktori A dengan isi nama file FileA, FileB, dst. Maka nanti setelah dizip, nama file dalam zip berubah menjadi AFileA, AFileB, dst. Meskipun ukuran file nya sama dengan yang asli, tapi tetep saja tidak boleh begitu.

function read_dir($path)
{
  if ($fp = @opendir($path))
  {
    while (FALSE !== ($file = readdir($fp)))
    {
      if (@is_dir($path.$file) && substr($file, 0, 1) != '.')
      {
        $this->read_dir($path.$file."/");
      }
      elseif (substr($file, 0, 1) != ".")
      {
        if (FALSE !== ($data = file_get_contents($path.$file)))
        {
          $this->add_data(str_replace("\\", "/", $path).$file, $data);
        }
      }
    }
    return TRUE;
  }
}

coba diganti menjadi seperti ini

function read_dir($path)
{
  if ($fp = @opendir($path))
  {
    while (FALSE !== ($file = readdir($fp)))
    {
      if (@is_dir($path.$file) && substr($file, 0, 1) != '.')
      {
        $this->read_dir($path.$file."/");
      }
      elseif (substr($file, 0, 1) != ".")
      {
        if (FALSE !== ($data = file_get_contents($path."/".$file)))
        {
          $this->add_data(str_replace("\\", "/", $path)."/".$file, $data);
        }
      }
    }
    return TRUE;
  }
}

Lihat ada penambahan “/” di beberapa bagian function itu. Akhirnya fungsi berjalan seperti yang diharapkan. Pada CI 1.7.0 nampaknya bug ini belum diberesin, soalnya aku compare 1.7.0 dan 1.6.3, library zip.php tidak mengalami perubahan.

Semoga membantu.