使用前请先开启:查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉;

        $zip=new \ZipArchive();
$zifile = 'download/' . $bookid . '.zip';//压缩包名字
if($zip->open($zifile, \ZipArchive::OVERWRITE)=== TRUE){
$this->addFileToZip('download/'.$bookname, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
} //添加文件方法
function addFileToZip($path,$zip){
//echo $path;
$handler=opendir($path); //打开当前文件夹由$path指定。
while(($filename=readdir($handler))!==false){
//var_dump($filename);continue;
if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
$this->addFileToZip($path."/".$filename, $zip);
}else{ //将文件加入zip对象
//echo $path."/".$filename.'<br>';
$a=substr($path."/".$filename,strlen('download/'));
//$zip->addFile($path."/".$filename);
$zip->addFile($path."/".$filename,$a);
}
}
}
@closedir($path);
}

下载文件

$this->download ($zifile,' '.$bookname . '.zip');

    /**
* 可以指定下载显示的文件名,并自动发送相应的Header信息
* 如果指定了content参数,则下载该参数的内容
* @static
* @access protected
* @param string $filename 下载文件名
* @param string $showname 下载显示的文件名
* @param integer $expire 下载内容浏览器缓存时间
* @return void
* @throws ThinkExecption
*/
protected function download ($filename, $showname='',$expire=180) {
if(file_exists($filename)){
$length = filesize($filename);
}elseif(is_file(UPLOAD_PATH.$filename)){
$filename = UPLOAD_PATH.$filename;
$length = filesize($filename);
}else {
throw_exception($filename.L('下载文件不存在!'));
}
if(empty($showname)){
$showname = $filename;
}
$showname = basename($showname);
if(empty($filename)){
$type = mime_content_type($filename);
}else{
$type = "application/octet-stream";
}
ob_end_clean();
//发送Http Header信息 开始下载
header("content-type:text/html; charset=utf-8");
header("Pragma: public");
header("Cache-control: max-age=".$expire);
//header('Cache-Control: no-store, no-cache, must-revalidate');
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$expire) . "GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s",time()) . "GMT");
//下面一行就是改动的地方,即用iconv("UTF-8","GB2312//TRANSLIT",$showname)系统函数转换编码为gb2312
header("Content-Disposition: attachment; filename=". iconv("UTF-8","gb2312",$showname));
header("Content-Length: ".$length);
header("Content-type: ".$type);
header('Content-Encoding: none');
header("Content-Transfer-Encoding: binary" );
ob_clean();
readfile($filename);
//exit();
}

php打包下载文件的更多相关文章

  1. ASP.NET 打包下载文件

    使用的类库为:ICSharpCode.SharpZipLib.dll 一种是打包整个文件夹,另一种是打包指定的多个文件,大同小异: using ICSharpCode.SharpZipLib.Zip; ...

  2. ASP.NET五步打包下载Zip文件

    本文版权归博客园和作者吴双共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 首先分享几个振奋人心的新闻: 1.谷歌已经宣布加入.NET基金会 2.微软加入Linux基金会, ...

  3. Java批量文件打包下载

    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...

  4. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

  5. ASP.NET多文件批量打包下载

    在对多文件打包中用到了 DotNetZip 的方法来实现对多文件压缩打包.需要到http://dotnetzip.codeplex.com/处下载该文件,然后引用即可. Default.aspx: & ...

  6. JavaWeb多文件上传及zip打包下载

    项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分.  首先明确一点:  无法通过页面的无刷新ajax请求,直接发下载.上 ...

  7. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天

    PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有 ...

  8. PHP 多文件打包下载 zip

    <?php $zipname = './photo.zip'; //服务器根目录下有文件夹public,其中包含三个文件img1.jpg, img2.jpg, img3.jpg,将这三个文件打包 ...

  9. servlet实现多文件打包下载

    当用户一次下载多个文件时.普通情况是,每下载一个文件,均要弹出一个下载的对话框.这给用户造成了非常大不便. 比較理想的情况是,用户选择多个文件后.server后端直接将多个文件打包为zip.以下贴出实 ...

随机推荐

  1. 建站手册-浏览器信息:Mozilla 项目

    ylbtech-建站手册-浏览器信息:Mozilla 项目 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_mozilla.asp 2. ...

  2. ! Failed at the chromedriver@2.35.0 install script.

    npm install 过程中报错 解决方法 运行 npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/d ...

  3. nginx的配置系统

    nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下. 配置文件中以#开始的行,或者是前面有若干空格或者TAB,然 ...

  4. MYSQL 使用存储过程批量更新表数据

    功能:实现将表result_good_city_dzl中的字段lat更新为表 result_good_city_lh中的lat,条件是两个表中的id一样 即: update result_good_c ...

  5. Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (2)

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.s ...

  6. 设置xampp开机自动启动

    l  设置xampp开机自动启动: 1)vi /etc/init.d/xampp.sh 增加:#!/bin/sh     /opt/lampp/lampp start 2)vi /etc/rc.d/r ...

  7. python杂货

    三.字典的基本操作 1.如何访问字典中的值? adict[key] 形式返回键key对应的值value,如果key不在字典中会引发一个KeyError. adict.get(key, default ...

  8. go语言从例子开始之Example19.接口

    接口 是方法特征的命名集合. Example: package main import "fmt" //让方法,实现api这个接口. type api interface{ get ...

  9. Welcome to MarkdownPad 2

    Welcome to MarkdownPad 2 MarkdownPad is a full-featured Markdown editor for Windows. Built exclusive ...

  10. Java高频经典面试题(第一季)五:递归与迭代

    编程题:  有n步台阶, 一次只能上 1步 或 2步, 共有多少种走法? 递归 循环迭代 递归: package will01; import org.junit.Test; public class ...