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

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

压缩下载类:

Hzip.php

<?php
/**
* Created by PhpStorm.
* @author: YJC
* @date: 2017/1/4
*/ namespace Yjc; use ZipArchive; class Hzip
{
/**
* Add files and sub-directories in a folder to zip file.
* @param string $folder
* @param ZipArchive $zipFile
* @param int $exclusiveLength Number of text to be exclusived from the file path.
*/
private static function folderToZip($folder, &$zipFile, $exclusiveLength) {
$handle = opendir($folder);
while (false !== $f = readdir($handle)) {
if ($f != '.' && $f != '..') {
$filePath = "$folder/$f";
// Remove prefix from file path before add to zip.
$localPath = substr($filePath, $exclusiveLength);
if (is_file($filePath)) {
$zipFile->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展示出来就行啦:

<table class="table table-striped table-bordered table-hover dataTable no-footer"  role="grid" aria-describedby="sample_1_info">
<thead>
<tr role="row">
<th width="13%">文件名</th>
<th width="7%">大小</th>
<th width="7%">类型</th>
<th width="13%">更新时间</th>
<th width="6%">操作</th>
</tr>
</thead>
<tbody>
<volist name="data.entrys" id="vo">
<tr class="gradeX odd" role="row">
<td>
<eq name="vo.type" value="dir">
<a href="{:U('Logstats/LogsList')}?path={$vo.entry}">{$vo.name} <i class="fa"></i></a>
<else/>
{$vo.name}
</eq>
</td> <td>{$vo.size}</td>
<td>{$vo.type}</td>
<td>{$vo.mtime|date='Y-m-d H:i:s' , ###}</td>
<td>
<eq name="vo.can_down" value="1">
<a href="{:U('Logstats/LogsList')}?op=download&path={$vo.entry}" target="_blank" class="btn btn-xs green">下载 <i class="fa"></i></a>
<else/> </eq> </td>
</tr>
</volist>
</tbody>
</table>

参考:

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

PHP日志压缩下载的更多相关文章

  1. Sqlserver2008日志压缩

    SqlServer2008日志压缩语句如下: USE [master] GO ALTER DATABASE DBName SET RECOVERY SIMPLE WITH NO_WAIT GO ALT ...

  2. 我是如何利用Hadoop做大规模日志压缩的

    背景 刚毕业那几年有幸进入了当时非常热门的某社交网站,在数据平台部从事大数据开发相关的工作.从日志收集.存储.数据仓库建设.数据统计.数据展示都接触了一遍,比较早的赶上了大数据热这波浪潮.虽然今天的人 ...

  3. Java批量压缩下载

    最近做了一些有关批量压缩下载的功能,网上也找了一些资源,但都不是太全面,所以自己整理一份,已备不时之需. 直接上代码: // 获取项目路径 private static String WEBCLASS ...

  4. Shell + crontab 实现日志压缩归档

    Shell + crontab 实现日志压缩归档 crontab # archive the ats log days. */ * * * * root /bin/>& shell #! ...

  5. linux下的日志压缩脚本

    linux下的日志压缩脚本: #!/bin/bash #第一步:先定义项目列表如下: projects="project-a project-b project-c project-d&qu ...

  6. Kafka日志压缩剖析

    1.概述 最近有些同学在学习Kafka时,问到Kafka的日志压缩(Log Compaction)问题,对于Kafka的日志压缩有些疑惑,今天笔者就为大家来剖析一下Kafka的日志压缩的相关内容. 2 ...

  7. 用Spring中的ResponseEntity文件批量压缩下载

    我看了很多网上的demo,先生成ZIP压缩文件,然后再下载. 我这里是生成ZIP文件流 进行下载.(核心代码没多少,就是一些业务代码) @RequestMapping(value = "/& ...

  8. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  9. MIT 6.824 Lab2D Raft之日志压缩

    书接上文Raft Part C | MIT 6.824 Lab2C Persistence. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src ...

随机推荐

  1. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  2. MIP改造常见问题二十问

    在MIP推出后,我们收到了很多站长的疑问和顾虑.我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助. 1.MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页 ...

  3. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  4. 浅谈WEB页面提速(前端向)

    记得面试现在这份工作的时候,一位领导语重心长地谈道——当今的世界是互联网的世界,IT企业之间的竞争是很激烈的,如果一个网页的加载和显示速度,相比别人的站点页面有那么0.1秒的提升,那也是很大的一个成就 ...

  5. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  6. H3 BPM社区:流程开发者的学习交流平台

    企业上市有上市流程,融资扩充有融资流程,项目招投标有招投标流程,部门领导选拔有晋升流程,员工请假休假有请假流程,早起上班梳洗有符合自己习惯的流程--生活处处是流程,流程无处不在.但从信息化建设来说,企 ...

  7. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  8. OpenDigg前端开源项目周报1219

    由OpenDigg 出品的前端开源项目周报第二期来啦.我们的前端开源周报集合了OpenDigg一周来新收录的优质的前端开发方面的开源项目,方便前端开发人员便捷的找到自己需要的项目工具等.react-f ...

  9. windows系统路径环境变量

    当前系统盘符%systemdrive%或%HOMEDRIVE%C:\ 当前系统目录%systemroot%或%Windir%C:\WINDOWS 当前用户文件夹%UserProfile%或%HOMEP ...

  10. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...