PHP ile ZIP Oluşturma Sınıfı - PHP Webmaster bilgi bankası, knowledge base Webmaster Araçları

AnaSayfa > PHP > PHP ile ZIP Oluşturma Sınıfı
Kategori: PHP
Gönderen: Admin
Tarih: 2009-02-12
Puan: 0   Puan:0 | Katılımcı:0 | Katılımcı : 0
Okunma: 3427
  
 
1 puan 2 puan 3 puan 4 puan 5 puan 6 puan 7 puan 8 puan 9 puan 10 puan

<?
class zipfile {
var $datasec=array(); // array to store compressed data
var $ctrl_dir=array(); // central directory
var $eof_ctrl_dir="x50x4bx05x06x00x00x00x00"; //end of Central directory record
var $old_offset=0;

function add_dir($name) {
// adds "directory" to archive - do this before putting any files in directory!
// $name - name of directory... like this: "path/"
// ...then you can add files using add_file with names like "path/file.txt"
$name=str_replace("\\\\", "/", $name);

$fr="x50x4bx03x04";
$fr .= "x0ax00"; // ver needed to extract
$fr .= "x00x00"; // gen purpose bit flag
$fr .= "x00x00"; // compression method
$fr .= "x00x00x00x00"; // last mod time and date

$fr .= pack("V",0); // crc32
$fr .= pack("V",0); //compressed filesize
$fr .= pack("V",0); //uncompressed filesize
$fr .= pack("v", strlen($name) ); //length of pathname
$fr .= pack("v", 0 ); //extra field length
$fr .= $name;
// end of "local file header" segment

// no "file data" segment for path

// "data descriptor" segment (optional but necessary if archive is not served as file)

$fr .= pack("V",$crc); //crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize

// add this entry to array
$this -> datasec[]=$fr;

$new_offset=strlen(implode("", $this->datasec));

// ext. file attributes mirrors MS-DOS directory attr byte, detailed
// at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp

// now add to central record
$cdrec="x50x4bx01x02";
$cdrec .="x00x00"; // version made by
$cdrec .="x0ax00"; // version needed to extract
$cdrec .="x00x00"; // gen purpose bit flag
$cdrec .="x00x00"; // compression method
$cdrec .="x00x00x00x00"; // last mod time & date
$cdrec .= pack("V",0); // crc32
$cdrec .= pack("V",0); //compressed filesize
$cdrec .= pack("V",0); //uncompressed filesize
$cdrec .= pack("v", strlen($name) ); //length of filename
$cdrec .= pack("v", 0 ); //extra field length
$cdrec .= pack("v", 0 ); //file comment length
$cdrec .= pack("v", 0 ); //disk number start
$cdrec .= pack("v", 0 ); //internal file attributes
$ext="x00x00x10x00";
$ext="xffxffxffxff";
$cdrec .= pack("V", 16 ); //external file attributes - \\'directory\\' bit set

$cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
$this -> old_offset=$new_offset;

$cdrec .= $name;
// optional extra field, file comment goes here
// save to array
$this -> ctrl_dir[]=$cdrec;
}
function add_file($data, $name) {
// adds "file" to archive
// $data - file contents
// $name - name of file in archive. Add path if your want
$name=str_replace("", "/", $name);
//$name=str_replace("", "", $name);
$fr="x50x4bx03x04";
$fr .= "x14x00"; // ver needed to extract
$fr .= "x00x00"; // gen purpose bit flag
$fr .= "x08x00"; // compression method
$fr .= "x00x00x00x00"; // last mod time and date

$unc_len=strlen($data);
$crc=crc32($data);
$zdata=gzcompress($data);
$zdata=substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len=strlen($zdata);
$fr .= pack("V",$crc); // crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize
$fr .= pack("v", strlen($name) ); //length of filename
$fr .= pack("v", 0 ); //extra field length
$fr .= $name;
// end of "local file header" segment

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not served as file)
$fr .= pack("V",$crc); //crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize

// add this entry to array
$this -> datasec[]=$fr;

$new_offset=strlen(implode("", $this->datasec));

// now add to central directory record
$cdrec="x50x4bx01x02";
$cdrec .="x00x00"; // version made by
$cdrec .="x14x00"; // version needed to extract
$cdrec .="x00x00"; // gen purpose bit flag
$cdrec .="x08x00"; // compression method
$cdrec .="x00x00x00x00"; // last mod time & date
$cdrec .= pack("V",$crc); // crc32
$cdrec .= pack("V",$c_len); //compressed filesize
$cdrec .= pack("V",$unc_len); //uncompressed filesize
$cdrec .= pack("v", strlen($name) ); //length of filename
$cdrec .= pack("v", 0 ); //extra field length
$cdrec .= pack("v", 0 ); //file comment length
$cdrec .= pack("v", 0 ); //disk number start
$cdrec .= pack("v", 0 ); //internal file attributes
$cdrec .= pack("V", 32 ); //external file attributes - \\'archive\\' bit set

$cdrec .= pack("V", $this -> old_offset );

//relative offset of local header
// &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
$this -> old_offset=$new_offset;

$cdrec .= $name;
// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[]=$cdrec;
}
function file() { // dump out file
$data=implode("", $this -> datasec);
$ctrldir=implode("", $this -> ctrl_dir);
return
$data.
$ctrldir.
$this -> eof_ctrl_dir.
pack("v", sizeof($this -> ctrl_dir)). // total # of entries "on this disk"
pack("v", sizeof($this -> ctrl_dir)). // total # of entries overall
pack("V", strlen($ctrldir)). // size of central dir
pack("V", strlen($data)). // offset to start of central dir
"x00x00"; // .zip file comment length
}
}



// ÖRNEK KULLANIMI
$zipfile=new zipfile();

// Zip Klasörünün İçinde Yeni Bir Klasör Oluşturmak İsterseniz
$zipfile -> add_dir("dir/");

// zip Klasörünün İçindeki Dosya İçeriği
$filedata="zip klasörünün içindeki dosyaya yazmak istedikleriniz buraya";
$zipfile -> add_file($filedata, "dir/file.txt");

// Bu Bölüm Zip Klasörünü Download Etmek İçin
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=test.zip");
echo $zipfile -> file();


// Bu Bölüm Zip Klasörünü Sunucunuza Kaydetmek İçin
$filename="output.zip";
$fd=fopen ($filename, "wb");
$out=fwrite ($fd, $zipfile -> file());
fclose ($fd);
?>



Yorumlar
Henüz Kimse Yorum Yapmamış, ilk yorumu siz ekleyin!
Yorum Ekleme Aparatı
Yorum Eklemek için lütfen sol menuden giris yapınız..
Toplam 0 yorum listelendi.