<?php namespace app\util; /** * 关于文件压缩和下载的类 * @author panzhide * @version 1.0 */ class ZipDownload { protected $file_path; /** * 构造函数 * @param [string] $path [传入文件目录] */ public function __construct($path) { $this->file_path = $path; //要打包的根目录 } /** * 入口调用函数 * @return [type] [以二进制流的形式返回给浏览器下载到本地] */ public function index() { $zip = new \ZipArchive(); $end_dir = $this->file_path . date(‘Ymd‘, time()) . ‘.zip‘; //定义打包后的包名 $dir = $this->file_path; if (!is_dir($dir)) { mkdir($dir); } if ($zip->open($end_dir, \ZipArchive::CREATE) === TRUE) { ///ZipArchive::OVERWRITE 如果文件存在则覆盖 $this->addFileToZip($dir, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法 $zip->close(); } if (!file_exists($end_dir)) { exit("无法找到文件"); } return $end_dir; // header("Cache-Control: public"); // header("Content-Description: File Transfer"); // header("Content-Type: application/zip"); //zip格式的 // header(‘Content-disposition: attachment; filename=‘ . basename($end_dir)); //文件名 // header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 // header(‘Content-Length:‘ . filesize($end_dir)); //告诉浏览器,文件大小 // @readfile($end_dir); // $this->delDirAndFile($dir, true); //删除目录和文件 // unlink($end_dir); ////删除压缩包 } /** * 文件压缩函数 需要开启php zip扩展 * @param [string] $path [路径] * @param [object] $zip [扩展ZipArchive类对象] */ protected function addFileToZip($path, $zip) { $handler = opendir($path); while (($filename = readdir($handler)) !== false) { if ($filename != "." && $filename != "..") { if (!is_dir($filename)) { $zip->addFile($path . "/" . $filename, $filename); //第二个参数避免将目录打包,可以不加 } } } @closedir($path); } /** * 删除文件函数 * @param [string] $dir [文件目录] * @param boolean $delDir [是否删除目录] * @return [type] [description] */ protected function delDirAndFile($path, $delDir = true) { $handle = opendir($path); if ($handle) { while (false !== ($item = readdir($handle))) { if ($item != "." && $item != "..") { if (is_dir($path . ‘/‘ . $item)) { $this->delDirAndFile($path . ‘/‘ . $item, $delDir); } else { unlink($path . ‘/‘ . $item); } } } @closedir($handle); if ($delDir) { return rmdir($path); } } else { if (file_exists($path)) { return unlink($path); } else { return FALSE; } } } }