Example of php compressed file zip
1. Please download the zip.php tool class I prepared first, unzip it after downloading, and put the files inside into the corresponding directory. I put it in the virtual directory in the include folder.
2. Add the following code to your php file
Usage:
require_once "./include/zip.php";
$zip = new PHPZip();
/ /$zip -> createZip("Directory address of the folder to be compressed", "Compressed file name.zip"); //Only generated and not automatically downloaded
$zip -> downloadZip("To be compressed Folder directory address", "Compressed file name.zip"); //Automatic download
example: You can refer to the following pseudo code to see a specific usage scenario: Code
require_once ". /include/zip.php";
if (!$download) {
exit();
}
set_time_limit(60);
$tmpManager = new TmpManager(); // Suppose we have a class to complete the following operations
$tempfolder = array();
$tempfile = array(); //Suppose we download the selected folder or file by selecting the checkbox on the page , and package together
for($i = 0;$i < $checkboxnum;$i ) {
$value = ${"select".$i};
if ($value != ) {
$this_type = substr($value, 0, 1);
$this_id = substr($value, 1);
//Handle folders and files separately
if ($this_type == d) {
$tempfolder[] = $this_id;
}
elseif ($this_type == f) {
$tempfile[] = $this_id;
}
}
}
@mkdir($tempdir);
$curtempdir = "$tempdir/".$userid; //Different users operate in different temporary folders
if (file_exists($curtempdir)) {
$tmpManager->DeleteDir($curtempdir); //Delete the old folder
}
if (sizeof($tempfolder) > 0 || sizeof($tempfile) > 0) {
mkdir($curtempdir, 0777); //If there are files or folders to be packaged, recreate the folder
}
if (sizeof($tempfile ) > 0) {
$tmpManager->CopyFile($tempfile,$curtempdir); //Copy the file to be downloaded to the created folder
}
if (sizeof($tempfolder) > ; 0) {
$tmpManager->CopyFolder($tempfolder,$curtempdir); //Copy the folder to be downloaded to the created folder
}
$zip = new PHPZip();
$zip -> downloadZip($curtempdir, "file_".date(Ymd).".zip");//Package and download
Compression class:
- /*
- File name: /include/zip.php
- Author: Horace 2009/04/15
- */
- class PHPZip{
- var $dirInfo = array("0","0");
- var $rootDir = ;
- var $datasec = array();
- var $ctrl_dir = array();
- var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
- var $old_offset = 0;
- function downloadZip(){
- createZip($dir, $zipfilename, true);
- }
- function createZip($dir, $zipfilename, $autoDownload = false){
- if (@function_exists(gzcompress)){
- @set_time_limit("0");
- if (is_array($dir)){
- $fd = fopen ($dir, "r");
- $fileValue = fread ($fd, filesize ($filename));
- fclose ($fd);
- if (is_array($dir)) $filename = basename($dir);
- $this -> addFile($fileValue, "$filename");
- }else{
- $this->dirTree($dir,$dir);
- }
- $zipfilenametemp = time().$ zipfilename;
- $out = $this -> filezip();
- $fp = fopen($zipfilenametemp, "w");
- fwrite($fp, $out, strlen($out));
- fclose($fp);
- $filesize = filesize($zipfilenametemp);
- if ($filesize < 104857600 ) {
- if($autoDownload){
- header("Content-type: application/octet-stream");
- header("Content-disposition: attachment; filename=".$zipfilename);
- }
- echo $this -> filezip();
- }else{
- echo "create zip error!";
- }
- unlink($zipfilenametemp);
- }
- }
- //get dir tree..
-
- function dirTree($directory,$rootDir){
- global $_SERVER,$dirInfo,$rootDir;
- $fileDir=$rootDir;
- $myDir=dir($directory);
- while($file=$myDir->read()){
-
-
- if(is_dir("$directory/$file") and $file!="." and $file!=".."){
- $dirInfo[0] ;
- $rootDir ="$fileDir$file/";
- $this -> addFile(, "$rootDir");
- //go on ns folders
-
- $this->dirTree("$directory/$file",$rootDir);
- }else{
- if($file!=". " and $file!=".."){
- $dirInfo[1] ;
- //$fd = fopen ("$directory/$file", "r");
-
- $fileValue = file_get_contents("$directory/$file");
- //fclose ($fd);
-
- $this -> addFile($fileValue, "$fileDir$file");
- }
- }
- }
- $myDir- >close();
- }
- function unix2DosTime($unixtime = 0) {
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
- if ($timearray[year] < 1980) {
- $timearray[year] = 1980;
- $timearray[mon] = 1;
- $timearray[mday] = 1;
- $timearray[hours] = 0;
- $timearray[minutes] = 0;
- $timearray[seconds] = 0;
- } // end if
- return (($timearray[year] - 1980) << 25) | ($timearray[mon] << 21) | ($timearray[mday] << 16) |
- ($timearray[hours] << 11) | ($timearray[minutes] << 5) | ($timearray[seconds] >> 1);
- }
- function addFile($data, $name, $time = 0){
- $name = str_replace(, /, $name);
- $dtime = dechex($this->unix2DosTime($time));
- $hexdtime = x . $dtime[6] . $dtime[7]
- . x . $dtime[4] . $dtime[5]
- . x . $dtime[2] . $dtime[3]
- . x . $dtime[0] . $dtime[1];
- eval($hexdtime = " . $hexdtime . ";);
- $fr = "x50x4bx03x04";
- $fr .= "x14x00"; // ver needed to extract
- $fr .= "x00x00"; // gen purpose bit flag
- $fr .= "x08x00"; // compression method
- $fr .= $hexdtime; // last mod time and date
- // "local file header" segment
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress($data);
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
- $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;
- // "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 .= $hexdtime; // 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
- $this -> old_offset = $new_offset;
- $cdrec .= $name;
- // optional extra field, file comment
http://www.bkjia.com/PHPjc/486133.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/486133.htmlTechArticlephp压缩文件zip的例子 1.请先下载我准备好的zip.php工具类,下载后解压,将里面的文件放入对应的目录中,我是放在虚拟目录下的include文件...
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn