百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

PHP实现下载与压缩文件的方法的封装与整理

yuyutoo 2024-11-20 23:55 1 浏览 0 评论

一、PHP实现打包zip并下载功能

$file_template = FCPATH.'canddata/cand_picture.zip';//在此之前你的项目目录中必须新建一个空的zip包(必须存在)
$downname = $card.'.zip';//你即将打包的zip文件名称
$file_name = FCPATH.'canddata/'.$card.'.zip';//把你打包后zip所存放的目录
$result = copy( $file_template, $file_name );//把原来项目目录存在的zip复制一份新的到另外一个目录并重命名(可以在原来的目录)
$zip = new ZipArchive();//新建一个对象
if ($zip->open($file_name, ZipArchive::CREATE) === TRUE) { //打开你复制过后空的zip包
  $zip->addEmptyDir($card);//在zip压缩包中建一个空文件夹,成功时返回 TRUE, 或者在失败时返回 FALSE
  //下面是我的场景业务处理,可根据自己的场景需要去处理(我的是将所有的图片打包)
  $i = 1;
  foreach ($cand_photo as $key3 => $value3) {
    $file_ext = explode('.',$value3['cand_face']);//获取到图片的后缀名
    $zip->addFromString($card.'/'.$card.'_'.$i.'.'.$file_ext[3] , file_get_contents($value3['cand_face']));//(图片的重命名,获取到图片的二进制流)
    $i++;
  }
  $zip->close();
  $fp=fopen($file_name,"r"); 
  $file_size=filesize($file_name);//获取文件的字节
  //下载文件需要用到的头 
  Header("Content-type: application/octet-stream"); 
  Header("Accept-Ranges: bytes"); 
  Header("Accept-Length:".$file_size);
  Header("Content-Disposition: attachment; filename=$downname"); 
  $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器) 
  $file_count=0; //读取的总字节数 
  //向浏览器返回数据 如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成
  while(!feof($fp) && $file_count<$file_size){ 
 $file_con=fread($fp,$buffer); 
 $file_count+=$buffer; 
 echo $file_con; 
 } 
  fclose($fp); 
  //下载完成后删除压缩包,临时文件夹 
  if($file_count >= $file_size) { 
    unlink($file_name); 
  }
}

二、PHP实现大文件下载

此方法为大文件下载的实现,即使几个G也可实现本地的下载。可以测试一下,或者等你从中改进...

function downloadFile($filename){
 //获取文件的扩展名
 $allowDownExt=array ( 'rar','zip','png','txt','mp4','html');
 //获取文件信息
 $fileext=pathinfo($filename);
 //检测文件类型是否允许下载
 if(!in_array($fileext['extension'],$allowDownExt)) {
 return false;
 }
 //设置脚本的最大执行时间,设置为0则无时间限制
 set_time_limit(0);
 ini_set('max_execution_time', '0');
 //通过header()发送头信息
 //因为不知道文件是什么类型的,告诉浏览器输出的是字节流
 header('content-type:application/octet-stream');
 //告诉浏览器返回的文件大小类型是字节
 header('Accept-Ranges:bytes');
 //获得文件大小
 //$filesize=filesize($filename);//(此方法无法获取到远程文件大小)
 $header_array = get_headers($filename, true);
 $filesize = $header_array['Content-Length'];
 //告诉浏览器返回的文件大小
 header('Accept-Length:'.$filesize);
 //告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称
 header('content-disposition:attachment;filename='.basename($filename));
 //针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
 $read_buffer=4096;
 $handle=fopen($filename, 'rb');
 //总的缓冲的字节数
 $sum_buffer=0;
 //只要没到文件尾,就一直读取
 while(!feof($handle) && $sum_buffer<$filesize) {
 echo fread($handle,$read_buffer);
 $sum_buffer+=$read_buffer;
 }
 //关闭句柄
 fclose($handle);
 exit;
}

三,PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载

这是一个类,封装了方法,也可以尝试一下!

<?php
/**
 * 关于文件压缩和下载的类
 * @author tycell
 * @version 1.0
 */
class zip_down{
 protected $file_path;
 /**
 * 构造函数
 * @param [string] $path [传入文件目录] 
 */
 public function __construct($path){
 $this->file_path=$path; //要打包的根目录
 }
 /**
 * 入口调用函数
 * @return [type] [以二进制流的形式返回给浏览器下载到本地]
 */
 public function index(){
 $zip=new ZipArchive();
 $end_dir=$this->file_path.date('Ymd',time()).'.zip';//定义打包后的包名
 $dir=$this->file_path;
 if(!is_dir($dir)){
 mkdir($dir);
 }
 if($zip->open($end_dir, ZipArchive::OVERWRITE) === TRUE){ ///ZipArchive::OVERWRITE 如果文件存在则覆盖
 $this->addFileToZip($dir, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
 $zip->close(); 
 }
 if(!file_exists($end_dir)){ 
 exit("无法找到文件"); 
 }
 header("Cache-Control: public"); 
 header("Content-Description: File Transfer"); 
 header("Content-Type: application/zip"); //zip格式的 
 header('Content-disposition: attachment; filename='.basename($end_dir)); //文件名 
 header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 
 header('Content-Length:'.filesize($end_dir)); //告诉浏览器,文件大小 
 @readfile($end_dir);
 $this->delDirAndFile($dir,true);//删除目录和文件
 unlink($end_dir);////删除压缩包
 }
 /**
 * 文件压缩函数 需要开启php zip扩展
 * @param [string] $path [路径]
 * @param [object] $zip [扩展ZipArchive类对象]
 */
 protected function addFileToZip($path, $zip){
 $handler = opendir($path);
 while (($filename=readdir($handler)) !== false) {
 if ($filename!= "." && $filename!=".."){
 if(!is_dir($filename)){ 
 $zip->addFile($path."/".$filename,$filename); //第二个参数避免将目录打包,可以不加
 }
 }
 }
 @closedir($path);
 }
 /**
 * 删除文件函数 
 * @param [string] $dir [文件目录]
 * @param boolean $delDir [是否删除目录]
 * @return [type] [description]
 */
 protected function delDirAndFile($path,$delDir=true){
 $handle=opendir($path);
 if($handle){
 while(false!==($item = readdir($handle))){
 if($item!="."&&$item!=".."){
 if(is_dir($path.'/'.$item)){
 $this->delDirAndFile($path.'/'.$item, $delDir);
 }else{
 unlink($path.'/'.$item);
 }
 }
 }
 @closedir($handle);
 if($delDir){return rmdir($path);}
 }else{
 if(file_exists($path)){
 return unlink($path);
 }else{
 return FALSE;
 }
 }
 }
}

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: