1. 使用PHP下载文件的操作需要给出四个header(),可以参考原作者的另一篇博文:PHP如何实现下载功能超详细流程分析,或者点击此处。

  2. 计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话,filesize可能就会是这样的形式了filesize($filehandle)

  3. 向客户端回送数据的是,记得要设置一个buffer,用来指定每次向客户端输出多少数据,如:$buffer=1023。如果不指定的话,就会将整个文件全部写入内存当中,再一次性的讲数据传送给客户端

  4. 通过feof()函数,可以判断要读取的文件是否读完,如果还没读完,继续读取文件($file_data=fread()),并将数据回送给客户端(echo $file_data)

  5. 每次下载完成后,在客户端都会刷新下,说明了,其实每次都将数据写入到一个临时文件中,等全部下载完成后,再将所有的数据重新整合在一起

  6. 这里我使用的是绝对路径,绝对路径有个好处,就是适应性比较强,而且相对于相对路径,效率更高(免去了查找文件的过程)

分析下技术要点:                           

  1. 将文件打包成zip格式

  2. 下载文件的功能

要点解析:

  1. 这里我采用的是php自带的ZipArchive类

a) 我们只需要new一个ZipArchive对象,然后使用open方法创建一个zip文件,接着使用addFile方法,将要打包的文件写入刚刚创建的zip文件中,最好还得记得关闭该对象。

b) 注意点:使用open方法的时候,第二个参数$flags是可选的,$flags用来指定对打开的zip文件的处理方式,共有四种情况

i. ZIPARCHIVE::OVERWRITE     总是创建一个新的文件,如果指定的zip文件存在,则会覆盖掉

ii. ZIPARCHIVE::CREATE     如果指定的zip文件不存在,则新建一个

iii. ZIPARCHIVE::EXCL      如果指定的zip文件存在,则会报错

iv. ZIPARCHIVE::CHECKCONS

服务器端的工作:
-------------------------------------------
客户端的浏览器发送一个请求到处理下载的php文件。
注意:任何一个操作都首先需要写入到内存当中,不管是视频、音频还是文本文件,都需要先写入到内存当中。
换句话说,将“服务器”上的文件读入到“服务器”的内存当中的这个操作时必不可少的(注意:这里我将服务器三个字加上双引号,主要是说明这一系类的操作时在服务器上完成的)。<br>
既然要将文件写入到内存当中,就必然要先将文件打开
所以这里就需要三个文件操作的函数了:
一:fopen($filename ,$mode)
二:fread ( int $handle , int $length )
三:fclose ( resource $handle )

---------------------------------------
客户端端的工作:
---------------------------------------
那么,如何将已经存在于服务器端内存当中的文件信息流,传给客户端呢?
答案是通过header()函数,客户端就知道该如何处理文件,是保存还是打开等等


最终的效果如下图所示:

<?php
require'./download.php';
/*** 遍历目录,打包成zip格式*/class traverseDir{public $currentdir;//当前目录public $filename;//文件名public $fileinfo;//用于保存当前目录下的所有文件名和目录名以及文件大小public function __construct(){$this->currentdir=getcwd();//返回当前目录}        //遍历目录public function scandir($filepath){if (is_dir($filepath)){$arr=scandir($filepath);foreach ($arr as $k=>$v){$this->fileinfo[$v][]=$this->getfilesize($v);}}else {echo "<script>alert('当前目录不是有效目录');</script>";}}/*** 返回文件的大小** @param string $filename 文件名* @return 文件大小(KB)*/public function getfilesize($fname){return filesize($fname)/1024;}/*** 压缩文件(zip格式)*/public function tozip($items){ $zip=new ZipArchive();$zipname=date('YmdHis',time());if (!file_exists($zipname)){$zip->open($zipname.'.zip',ZipArchive::OVERWRITE);//创建一个空的zip文件for ($i=0;$i<count($items);$i++){$zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]);}$zip->close();$dw=new download($zipname.'.zip'); //下载文件$dw->getfiles();unlink($zipname.'.zip'); //下载完成后要进行删除    }}}
?>
<?php
/*** 下载文件**/class download{protected $_filename;protected $_filepath;protected $_filesize;//文件大小public function __construct($filename){$this->_filename=$filename;$this->_filepath=dirname(__FILE__).'/'.$filename;}//获取文件名public function getfilename(){return $this->_filename;}//获取文件路径(包含文件名)public function getfilepath(){return $this->_filepath;}//获取文件大小public function getfilesize(){return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);//去小数点后两位}//下载文件的功能public function getfiles(){//检查文件是否存在if (file_exists($this->_filepath)){//打开文件$file = fopen($this->_filepath,"r");//返回的文件类型Header("Content-type: application/octet-stream");//按照字节大小返回Header("Accept-Ranges: bytes");//返回文件的大小Header("Accept-Length: ".filesize($this->_filepath));//这里对客户端的弹出对话框,对应的文件名Header("Content-Disposition: attachment; filename=".$this->_filename);//修改之前,一次性将数据传输给客户端echo fread($file, filesize($this->_filepath));//修改之后,一次只传输1024个字节的数据给客户端//向客户端回送数据$buffer=1024;////判断文件是否读完while (!feof($file)) {//将文件读入内存$file_data=fread($file,$buffer);//每次向客户端回送1024个字节的数据echo $file_data;}fclose($file);}else {echo "<script>alert('对不起,您要下载的文件不存在');</script>";}}}
?>

页面代码

<script type="text/javascript" src="jquery-1.7.2.js"></script>
<script type="text/javascript" src="ajax.js"></script>
<?phpheader("Content-type:text/html;charset=utf8");require('./getfile.php');$scandir=new traverseDir();$scandir->scandir($scandir->currentdir);$scandir->currentdir;if (isset($_POST['down_load'])){ $items=$_POST['items'];$scandir->tozip($items);//将文件压缩成zip格式} echo "当前的工作目录:".$scandir->currentdir;echo "<br>当前目录下的所有文件";
?><form action="list.php" method="POST">
<table><tr><td></td><td>名称</td><td>大小(KB)</td></tr>
<?php$res=$scandir->fileinfo;foreach ($res as $k=>$v){if (!($k=='.' || $k=='..'))    {//过滤掉.和..
?><tr><td><input type="checkbox" name="items[]" class="filename" value="<?php echo $k;?>"></td><td><?php echo $k; ?></td><td><?php echo number_format($v[0],0); ?></td></tr>
<?php}}
?><tr><td><input type="checkbox" id="selall"><label for="selall">全选</label></td><td><input type="submit" name="down_load" value="打包并下载" id="tozip_tetttt"></td></tr>
</table>
</form>

文件打包下载 (ZipArchive)相关推荐

  1. php本地文件打包代码,PHP实战:几行代码轻松实现PHP文件打包下载zip

    <PHP实战:几行代码轻松实现PHP文件打包下载zip>要点: 本文介绍了PHP实战:几行代码轻松实现PHP文件打包下载zip,希望对您有用.如果有疑问,可以联系我们. PHP应用 //获 ...

  2. 网页实现文件打包下载

    网页实现文件打包下载 前段时间收到需要批量下载文件的需求.一开始是做一个把所有需要下载的文件复制到粘贴板这样就可以去迅雷或者其他下载软件批量下载,但是这样还是不能满足用户的需求. 用户希望一点击就把所 ...

  3. Java如何实现文件打包下载功能

        在日常项目开发中,我们会经常遇到,上传下载以及打包的常用功能,本节中就如何利用JAva自带的类库,实现zip压缩打包文件下载进行详细说明.注:不支持中文文件名,可在上传时就重命名文件名称.(下 ...

  4. java 文件打包下载

    话不多说,直接上代码 方法需要传入文件目录,比如想打包1目录下的2目录,同时2目录包含3和4目录,name就传入1目录就可以了 打包之后 /*** 文件打包下载** @param src 需要打包的文 ...

  5. java 文件下载代码_java文件下载代码实例(单文件下载和多文件打包下载)

    这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近项目有需要写文件下载相关 ...

  6. 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip

    2019独角兽企业重金招聘Python工程师标准>>> <?php //获取文件列表 function list_dir($dir){$result = array();if ...

  7. 单小说下载php,PHP 单TXT下载和多个TXT文件打包下载 同时

    思路:下载链接多带一个参数,在PHP页面判断是单个下载还是zip下载 HTML: 下载TXT php: //下载小说章节函数 function downfile($fileurl) { $filena ...

  8. Java简单的文件打包下载

    案例: @ResponseBody@RequestMapping("/templateDownload")public void templateDownload(HttpServ ...

  9. php 遍历文件夹并压成zip_php ZipArchive实现多文件打包下载实例

    实例代码: public function downLoad($dataUrl,$saveName) { $datalist = [ ROOT_PATH.'/public/introduce/110. ...

  10. Java 批量文件不打包下载_【Java】Java批量文件打包下载zip

    /* * 另存为 */ @RequestMapping("/saveAs.do") public @ResponseBody void saveAs(String filePath ...

最新文章

  1. 矩阵消除游戏--牛客练习赛58
  2. 01二维矩阵中最大全为1的正方形maxSquare——经典DP问题(二维)
  3. python变量类型-【干货】Python基础语法之变量类型
  4. shell按行读取文件的常见几种方法
  5. PHP中文乱码解决办法
  6. linux中的信号2——进程如何处理信号?
  7. 论文浅尝 | 基于Freebase的问答研究
  8. Redis主从配置详细过程
  9. 生产环境Go程序内存泄露,用pprof如何快速定位
  10. java读取propertiesshib,Java CommonUtils.constructServiceUrl方法代码示例
  11. 直接调用高德地图_高德上线“充电地图”功能 覆盖全国96%充电桩信息
  12. linux6.5双屏显示,Redhat 6.5的系统如何设置双显示屏,急急急!
  13. 转: android编译过程(流程图)
  14. Servlet+JSP分页
  15. seo好学吗?怎么学seo?
  16. Android平台Cocos2dx打包流程
  17. Android开发之连接夜神模拟器
  18. sin2x麦克劳林公式_sinx泰勒公式展开
  19. CSDN日报20170325——《一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。》
  20. openresty ngx_lua获取环境变量

热门文章

  1. Win10 Print Spooler 一直停止服务
  2. 酷派大神9976A刷机
  3. 广数系统加工中心编程_图解数控铣及加工中心加工工艺与编程——(FANUC系统)/(SIEMENS系统)...
  4. HackerRank数据库题目练习(2)
  5. 5款Java微服务开源框架
  6. 成神之路——实施工程师
  7. AT+CIPSNTPTIME?总是返回 1970年1月1日00:00:00
  8. 服务价格实惠的Andr​​oid游戏开发公司
  9. 2021最新 武汉互联网公司
  10. 大数据项目开发进度(实时更新)