说明
实现效果:使用php压缩目标目录成zip文件,并下载
环境框架:laravel 5.1 php 5.6
示例
逻辑处理片段代码:

use ZipArchive;//此处需要引入ZipArchive类
/*** 文件夹打包下载* @param Request $request*/
public function Down(Request $request) {//判断zip扩展类是否加载if ( ! extension_loaded('zip')) {return Redirect::back();}set_time_limit(0);$iId = $request->get('id');//获取需要压缩的文件路径$aResArr = Compress::getTargetDirectory($iId);if ($aResArr === false || $aResArr['sDir'] == '') {return Redirect::back();}//生成压缩包$oZip = new ZipArchive();//压缩包命名$sZipName = md5(uniqid() . time()) . '.zip';//将一级目录名作为下载压缩包名$sFileName = $aResArr['sFileName'] ? $aResArr['sFileName'] . '.zip' : $sZipName;$sRes = $oZip->open($sZipName, ZipArchive::OVERWRITE | ZipArchive::CREATE);if($sRes === true) {//压缩目标目录Compress::compressTargetDirectory($aResArr['sDir'], $oZip);$oZip->close();}//下载压缩包header('Content-Type:application/zip');if (preg_match("/MSIE/", $_SERVER["HTTP_USER_AGENT"])) {header('Content-Disposition: attachment; filename="' . rawurlencode($sFileName) . '"');} else if (preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) {header('Content-Disposition: attachment; filename*="utf8\'\'' . $sFileName . '"');} else {header('Content-Disposition: attachment; filename="' . $sFileName . '"');}header('Content-Length:' . filesize($sZipName));session_write_close();readfile($sZipName);ob_flush();flush();//删除生成的目标目录Compress::removeTargetDirectory($aResArr['sDir']);//删除生成的压缩包unlink($sZipName);
}

操作类代码(compress.php):

<?php
/*** 文件压缩类*/namespace App\Services;use App\File;
use Illuminate\Support\Facades\DB;class Compress
{/*** 获取文件信息* @param $iId* @return bool*/public static function getFileInfo($iId){if ( ! $iId) {return false;}return File::select('id', 'name', 'isdir', 'loc')->where('id', $iId)->first();}/*** 获取指定文件夹下所有信息* @param $iId* @return bool*/public static function getFileInfoById($iId){if ( ! $iId) {return false;}$aConditions = [':path' => '%/' . $iId . '/' . '%'];$sSql = 'SELECT * FROM `File` WHERE `path` LIKE :path';return DB::select($sSql, $aConditions);}/*** 创建目标目录或文件* @param $sName 目标目录或名称* @param $sPath 目标目录路径* @param int $iStatus 目录类型 0 文件 1 文件夹名称* @param string $sPrev 上级目录路径* @return bool|string*/public static function createDirectory($sName, $sPath, $iStatus = 0, $sPrev = ''){if ( ! defined('COM_DIR') ) {define('COM_DIR', storage_path('upload/compress'));}if ( ! defined('UP_DIR') ) {define('UP_DIR', storage_path('upload/files'));}if ( ! defined('DS')) {define('DS', DIRECTORY_SEPARATOR);}$newDir =  $sPrev ?: COM_DIR . DS . md5(uniqid());if ($iStatus == 0) {//文件$sExt = self::getExtByPath(trim($sPath));$sFileName = $sName ? basename($sName, '.' . self::getExtByPath(trim($sName))) . '.' . $sExt : basename($sPath);$newPath = $newDir . DS . $sFileName;//判断文件是否存在if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {$newPath = iconv('utf-8', 'gbk//IGNORE', $newPath);}//文件不存在if ( ! file_exists($sPath)) {return false;}//文件夹不存在,创建文件夹if ( ! file_exists($newDir)) {mkdir($newDir, 0777, true);}//copy原有文件到新目录if ( ! copy($sPath, $newPath)) {return false;}} else {//文件夹if ( ! $sName) {return false;}$newPath = $newDir . DS . $sName;//判断文件是否存在if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {$newPath = iconv('utf-8', 'gbk//IGNORE', $newPath);}//文件夹不存在,创建文件夹if ( ! file_exists($newPath)) {mkdir($newPath, 0777, true);}}return $newPath;}/*** 获取目标目录路径* @param $iId 目标id* @param string $sPrev 上级目录路径* @return array|bool*/public static function getDirectory($iId, $sPrev = ''){$sDir = '';$sFileName = '';//获取目标文件信息$aFile = self::getFileInfo($iId);if (count($aFile) < 1) {return false;}//创建目标目录路径$sPath = self::createDirectory($aFile->name, $aFile->loc, $aFile->isdir ? 1 : 0, $sPrev);//目标目录路径,与文件名获取if ($sPrev == '') {$sDir = $sPath ?: '';$sFileName = $aFile->isdir ? $aFile->name : basename($aFile->name, '.' . self::getExtByPath(trim($aFile->name)));}//循环文件夹,生成子目录if ($aFile->isdir == 1) {//文件夹$aList = self::getFileInfoById($aFile->uid, $aFile->id);if (count($aList) > 0) {foreach ($aList as $v) {self::getDirectory($v->id, $sPath);}}}return ['sDir' => $sDir,'sFileName' => $sFileName];}/*** 压缩目标目录* @param $sDir 目标目录路径* @param $aZip ZipArchive类对象* @param string $sPrev 上级目录路径* @return null*/public static function compressDirectory($sDir, $aZip, $sPrev = ''){$sBasename = basename($sDir);//文件(夹)名$sBasePath = $sPrev ? $sPrev . '/' . $sBasename : $sBasename;//目标根目录if(is_dir($sDir)) {$oHandler = opendir($sDir);$aZip->addEmptyDir($sBasePath);while ($oFile = readdir($oHandler)) {$sRealPath = $sDir . '/' . $oFile;if (is_dir($sRealPath)) {if ($oFile !== '.' && $oFile !== '..') {$aZip->addEmptyDir($sBasePath . '/' . $oFile);self::compressDirectory($sRealPath, $aZip, $sBasePath);}} else {$aZip->addFile($sRealPath, $sBasePath . '/' . $oFile);}}closedir($oHandler);} else {$aZip->addFile($sDir, $sBasePath);}return null;}/*** 删除生成的目标目录* @param $sDir*/public static function removeDirectory($sDir){//获取包含目标目录的上级目录路径$sDir = str_replace('\\' . basename($sDir), '', $sDir);//判断当前目录类型if (is_dir($sDir)) {$oHandler = opendir($sDir);while ($oFile = readdir($oHandler)) {$sRealPath = $sDir . '/' . $oFile;if (is_dir($sRealPath)) {if ($oFile !== '.' && $oFile !== '..') {self::removeDirectory($sRealPath);}} else {//删除文件unlink($sRealPath);}}closedir($oHandler);rmdir($sDir);} else {unlink($sDir);}}/*** 获取文件后缀* @param $sPath*/public static function getExtByPath($sPath){$sUrl = parse_url($sPath); // 解析url 返回其组成部分return pathinfo($sUrl['path'], PATHINFO_EXTENSION); //返回文件扩展名信息}
}

php zip压缩包下载相关推荐

  1. ZIP压缩包下载总结

    ZIP压缩包下载总结: 1.需要将所有要压缩的文件或文件夹放至一个最外层的文件夹下(注意:该文件夹不会压缩进去,所以可以用随机数对包名进行命名,避免重复,currentFolder = "D ...

  2. 使用BLOB 进行docx格式文件、zip压缩包下载

    // docx 文件下载    如需xlsx格式文件 换掉后缀即可 useExportWithAxios: (url, params, file) => { // url 接口路径 // par ...

  3. java 导出表格打包zip文件下载_asyExcel导出excel并打包成zip压缩包下载

    假期期间自己在家撸码,刚好用到了导出,导出来之后是多个文件,所以需要打成压缩包并下载来给客户.查阅了一些资料,把这段代码贴在这,相当于有个记录吧. package com.business.testE ...

  4. easyExcel导出excel文件并打包成zip压缩包下载

    文件导出 专栏收录该内容 2 篇文章0 订阅 订阅专栏 package com.business.testExcelPort; import java.io.BufferedInputStream; ...

  5. 使用Hutool生成多个excel文件合并成zip压缩包下载

    这几天有个业务需要把项目里数据生成excel后打包zip下载,但之前的项目基本都是用Apache自带的poi去做,这个项目引入Hutool工具,所以就用了Hutool的功能去做了,跟之前相比感觉省事了 ...

  6. 通过javascript在网页端生成zip压缩包并下载

    通过javascript在网页端生成zip压缩包并下载 原文:通过javascript在网页端生成zip压缩包并下载 zip.js是什么 zip.js的github项目地址:http://gildas ...

  7. JavaWeb项目文件夹生成Zip压缩包并下载到本地

    1.FileToZip接口类 /**  *  */ package com.sale.util; import java.io.BufferedInputStream;   import java.i ...

  8. 【java】 文件批量下载并压缩为zip压缩包

    [java] 文件批量下载并压缩为zip压缩包 java常用的压缩技术 java中常见实现压缩与解压 业务场景 代码实现 注意点 java常用的压缩技术 常见的压缩格式有很多种,例如:zip.rar. ...

  9. 批量下载文件,打包成zip压缩包

    批量下载文件,用程序打成zip压缩包在下载 前台传来要下载的url数组 @RequestMapping(value = "/download",method = RequestMe ...

  10. SpringBoot多文件压缩包下载(多附件zip格式)

    文章目录 前言 : 此 Demo 为 Windows 环境下演示,部署到服务器的话路径需改成服务器的路径. 一.自定义工具类DownLoadZipUtil 二.Dao层分析与sql mapper层代码 ...

最新文章

  1. 转帖:硬盘生产全过程(图)
  2. mysql数据类型默认长度_mysql数据类型长度
  3. IOS开发——01_第一个OC程序
  4. Serenity安装和创建DEMO--学习第一天
  5. 原来安全也能像足球那么踢的
  6. Facebook视频支持AV1
  7. Bzoj2037: [Sdoi2008]Sue的小球
  8. mysql五大子句_MySQL的查询语句中可以使用以下哪个子句来表示分组查询
  9. 转 C#对多个集合和数组的操作(合并,去重,判断)
  10. Java 串口 mysql_java串口通讯
  11. 最全的软件开发报价标准
  12. 漫画算法python篇pdf_用Python抓取漫画并制作mobi格式电子书
  13. 模拟退火算法及MATLAB代码
  14. 很遗憾,该服务器不支持 jmail 组件!,jmail组件注册以及权限设置问题
  15. matlab 不显示图中的x,y轴
  16. JQuery实现防抖节流
  17. OpenBmc开发5:bitbake介绍与使用
  18. 电能管理系统在中材萍乡水泥4500t/d生产线改造上的应用
  19. 计算机应用简答,计算机应用基础简答题.doc
  20. Codeforces Round #796 (Div. 2)

热门文章

  1. Typo: In word xxxx
  2. 67.220.92.12 /forum index.php,http://67.220.92.21/forum/inde PHP静态类
  3. springboot+农机装备生产车间物料配送车辆调度管理系统 毕业设计-附源码181710
  4. 三种设计满足需求 网吧网络解决方案(转)
  5. 给定一个 n X n 的矩阵,求它的转置矩阵
  6. 【历史上的今天】2 月 23 日:英格玛密码机申请专利;戴尔电脑创始人出生;Mellanox 收购 EZchip
  7. php红包现金,php实现微信支付之现金红包
  8. 用什么软件编写html语言,可以用什么工具编写javascript?
  9. 06.输入系统:第10课第20节_输入系统_多点触摸_电容屏驱动程序
  10. 千古兴亡多少事,一江春水向东流--转任总文章