PHP实现将多个文件压缩成zip格式并下载到本地的方法示例

本文实例讲述了PHP实现将多个文件压缩成zip格式并下载到本地的方法分享给大家供大家参考,具体如下:

废话不多说,直接上代码

open($zipname,ZipArchive::CREATE); if ($res === TRUE) { foreach ($files as $file) { //这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名 $new_filename = substr($file,strrpos($file,'/') + 1); $zip->addFile($file,$new_filename); } } //关闭文件 $zip->close();
rush:PHP;"> //这里是下载zip文件 header("Content-Type: application/zip"); header("Content-transfer-encoding: Binary"); header("Content-Length: " . filesize($zipname)); header("Content-disposition: attachment; filename=\"" . basename($zipname) . "\""); readfile($zipname); exit;

附:

这里再为大家提供一个zip压缩类:

rush:PHP;"> GetFileList($dir); } if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir); else chdir($curdir); if (count($filelist)>0) { foreach($filelist as $filename) { if (is_file($filename)) { $fd = fopen ($filename,"r"); $content = fread ($fd,filesize ($filename)); fclose ($fd); if (is_array($dir)) $filename = basename($filename); $this -> addFile($content,$filename); } } $out = $this -> file(); chdir($curdir); $fp = fopen($zipfilename,"w"); fwrite($fp,$out,strlen($out)); fclose($fp); } return 1; } else return 0; } function GetFileList($dir) { if (file_exists($dir)) { $args = func_get_args(); $pref = $args[1]; $dh = opendir($dir); while($files = readdir($dh)) { if (($files!=".")&&($files!="..")) { if (is_dir($dir.$files)) { $curdir = getcwd(); chdir($dir.$files); $file = array_merge($file,$this -> GetFileList("","$pref$files/")); chdir($curdir); } else $file[]=$pref.$files; } } closedir($dh); } return $file; } var $datasec = array(); var $ctrl_dir = array(); var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00"; var $old_offset = 0; /** * Converts an Unix timestamp to a four byte DOS date and time format (date * in high two bytes,time in low two bytes allowing magnitude comparison). * * @param integer the current Unix timestamp * * @return integer the current date in a four byte DOS format * * @access private */ 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); } // end of the 'unix2DosTime()' method /** * Adds "file" to archive * * @param string file contents * @param string name of the file in the archive (may contains the path) * @param integer the current timestamp * * @access public */ 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,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 goes here // save to central directory $this -> ctrl_dir[] = $cdrec; } // end of the 'addFile()' method /** * Dumps out file * * @return string the zipped file * * @access public */ function 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 } // end of the 'file()' method } // end of the 'PHPZip' class ?>

用法

Zip($zipfiles,$zipfile);

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《PHP常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用