博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP日志压缩下载
阅读量:6086 次
发布时间:2019-06-20

本文共 6384 字,大约阅读时间需要 21 分钟。

主要实现了在后台查看日志列表及打包下载功能。

663847-20170104162239300-1616309202.jpg

由于用到了PHP压缩功能,特此记录下。

压缩下载类:

Hzip.php

addFile($filePath, $localPath); } elseif (is_dir($filePath)) { // Add sub-directory. $zipFile->addEmptyDir($localPath); self::folderToZip($filePath, $zipFile, $exclusiveLength); } } } closedir($handle); } private static function fileToZip($folder, &$zipFile, $exclusiveLength) { $localPath = substr($folder, $exclusiveLength); $zipFile->addFile($folder, $localPath); } /** * Zip a folder (include itself). * Usage: * HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip'); * * @param string $sourcePath Path of directory to be zip. * @param string $outZipPath Path of output zip file. */ public static function zipDir($sourcePath, $outZipPath) { $pathInfo = pathinfo($sourcePath); $parentPath = $pathInfo['dirname']; $dirName = $pathInfo['basename']; $z = new ZipArchive(); $z->open($outZipPath, ZipArchive::CREATE); $z->addEmptyDir($dirName); if(is_dir($sourcePath)){ self::folderToZip($sourcePath, $z, strlen("$parentPath/")); }else{ self::fileToZip($sourcePath, $z, strlen("$parentPath/")); } $z->close(); } public static function download($file){// $filename = sys_get_temp_dir() ."/log.zip"; //最终生成的文件名(含路径) $filename = sys_get_temp_dir() ."/". basename($file) . '.zip'; //最终生成的文件名(含路径) self::zipDir($file, $filename);// header("Cache-Control: public");// header("Content-Description: File Transfer");// header("Content-type: application/octet-stream ");// header("Accept-Ranges: bytes "); header('Content-disposition: attachment; filename='.basename($filename)); //文件名 header("Content-Type: application/zip"); //zip格式的 header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 header('Content-Length: '. filesize($filename)); //告诉浏览器,文件大小 ob_clean(); flush(); @readfile($filename); } /** * 转换文件大小 * @param $fileSize * @return string */ public static function convertSize($fileSize) { $size = sprintf("%u", $fileSize); if($size == 0) { return("0 Bytes"); } $sizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB"); return round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizename[$i]; } /** * 获取文件夹大小 * 不建议使用,太慢 * @param $dir * @return int */ public static function getDirSize($dir) { //避免计算父级目录 if(stripos($dir, '..')){ return filesize($dir); } $sizeResult = 0; $handle = opendir($dir); while (false!==($FolderOrFile = readdir($handle))) { if($FolderOrFile != "." && $FolderOrFile != "..") { if(is_dir("$dir/$FolderOrFile")){ $sizeResult += self::getDirSize("$dir/$FolderOrFile"); }else{ $sizeResult += filesize("$dir/$FolderOrFile"); } } } closedir($handle); return $sizeResult; }}?>

逻辑部分无非就是打开某个目录,然后列出来:

/**     * 日志管理     */    public function LogsList(){        //默认路径        $default_dir = APP_PATH . "Logs/";        //获取路径        if(isset($_GET['path'])){            $dirpath =   $_GET['path'];        }else{            $dirpath =  $default_dir;        }        //路径安全检查        if(stripos($dirpath, 'Logs') === false){            $dirpath =  $default_dir;        }        //规范化路径        $dirpath = realpath($dirpath);        //操作        $op = empty($_GET['op']) ? 'list' : $_GET['op'];        switch ($op){            case 'list':                $this->LogsListList($dirpath);                break;            case 'download':                \Yjc\Hzip::download($dirpath);                break;        }    }    private function LogsListList($dirpath){        //打开路径        $d  =  dir($dirpath);        $data = array();        $data['path'] = $d -> path;//        $data['log_path'] = getDomain() . "/Logs/http/$date";        while ( false  !== ( $entry  =  $d -> read ())) {//            $entryname = realpath($d -> path .'/'. $entry);            $entryname = $d -> path .'/'. $entry;//            $filesize = \Yjc\Hzip::getDirSize($entryname);            $filesize = filesize($entryname);            $files = array(                'path' => $d->path,                'name' => $entry,                'entry' => $entryname,                'size' => \Yjc\Hzip::convertSize($filesize),//大小                'mtime' => filemtime ($entryname),                'type' => is_dir($entryname) ? 'dir' : 'file',                'can_down' => in_array($entry, array('.', '..')) ? 0 : 1,            );            $filenames[] = $entry;            $data['entrys'][] = $files;        }        //排序        array_multisort($filenames,SORT_ASC,SORT_STRING, $data['entrys']);        $d -> close ();//        dump($data);        $this->assign('data', $data);        $this->display(':http_logs_list');    }

前端把$data展示出来就行啦:

参考:

1、php如何读取文件夹目录里的文件并按照日期,大小,名称排序 - fzxu_05的个人页面
https://my.oschina.net/wojibuzhu/blog/211674
2、php 文件下载 出现下载文件内容乱码损坏的解决方法 - 微凉 - 博客频道 - CSDN.NET
http://blog.csdn.net/wlqf366/article/details/8744599
3、php实现在线解压、压缩zip文件并下载 | 常亮的技术博客
http://www.diantuo.net/328

转载于:https://www.cnblogs.com/52fhy/p/6249155.html

你可能感兴趣的文章
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>