123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <?php
- declare(strict_types=1);
- namespace app\utils;
- use ZipArchive;
- class ZipUtils
- {
- public function packZip($source, $dest)
- {
- //判断zip扩展是否加载或者文件目录是否存在
- if (!extension_loaded('zip') || !file_exists($source)) {
- return false;
- }
- //创建一个zip打包文件
- $zip = new ZipArchive();
- if (!$zip->open($dest, ZipArchive::CREATE)) {
- return false;
- }
- $source = str_replace('\\', '/', realpath($source));
-
- if (is_dir($source) === true) {
- //创建件一个目录迭代器
- $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source));
- foreach ($files as $file) {
- $file = str_replace('\\', '/', $file);
- //忽略当前目录和上级目录
- if (in_array(substr($file, strrpos($file, '/') + 1), array('.', '..'))) {
- continue;
- }
- if (is_dir($file) === true) {
- //创建一个子目录
- $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
- } else if (is_file($file) === true) {
- //创建一个子文件
- $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
- } else if (is_file($source) === true) {
- //创建文件根目录下的文件
- $zip->addFromString(basename($source), file_get_contents($source));
- }
- }
- $zip->close();
- }
- }
- protected function addFileToZip(string $path, ZipArchive $zip)
- {
- $handler = opendir($path); //打开当前文件夹由$path指定。
- while (($filename = readdir($handler)) !== false) {
- if ($filename != "." && $filename != "..") { //文件夹文件名字为'.'和‘..’,不要对他们进行操作
- if (is_dir($path . "/" . $filename)) {
- $this->addFileToZip($path . "/" . $filename, $zip);
- } else {
- $zip->addFile($path . "/" . $filename);
- }
- }
- }
- @closedir($handler);
- }
- /**
- * 删除临时路径
- * @param $path
- */
- public function deleteDir($path)
- {
- if (is_dir($path)) {
- //
- $dirs = scandir($path);
- foreach ($dirs as $dir) {
- if ($dir != '.' | $dir != '..') {
- $sonDir = $path . '/' . $dir;
- if (is_dir($sonDir)) {
- $this->deleteDir($sonDir);
- @rmdir($sonDir);
- } else {
- @unlink($sonDir);
- }
- }
- }
- @rmdir($path);
- }
- }
- /**
- * 文件下载
- * @param $file
- */
- public function downLoad($file)
- {
- if (file_exists($file)) {
- $openFile = fopen($file, 'r');
- //返回文件类型
- Header('Content-type: application/octet-iostream');
- //返回文件的字节大小
- Header('Accept-Range: bytes');
- //返回文件大小
- Header('Accept-Length: ' . $file);
- //这里对客户端弹出的对话框,对应的文件名
- Header('Content-disposition: filename=' . substr($file, strrpos($file, '/') + 1));
- $buffer = 1024;
- while (!feof($openFile)) {
- $file_data = fread($openFile, $buffer);
- echo $file_data;
- }
- fclose($file);
- @unlink($file);
- } else {
- echo '下载文件不存在';
- }
- }
- }
|