【转】PHP实现下载与压缩文件的封装与整理    https://mp.weixin.qq.com/s/BUI3QsdNi6Nqu0NhrUL8hQ

一、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;
}
}
} }

扫二维码,关注更多PHP资讯!

【转】PHP实现下载与压缩文件的封装与整理的更多相关文章

  1. Android 下载zip压缩文件并解压

    网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,在此记录一下下载zip文件并直接解压的方法. 其实也很简单,就是把下载文件和解压zip文件结合到一起.下面即代码: URLConne ...

  2. iOS中使用ZipArchive压缩和解压缩文件-备

    为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...

  3. Linux中下载,压缩,解压等命令

    查看是否和还有一台Linux机器相通命令:ssh    主机名@Ip地址    ,提示输入password.就可以查看远程文件的文件夹 下载远程机器上的文件:scp  主机名@Ip地址:/path/s ...

  4. Freemaker基于word模板动态导出压缩文件汇总整理

    Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...

  5. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  6. C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

    工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...

  7. Jsp实现筛选并压缩文件批量下载

    Jsp实现筛选并压缩文件批量下载 首先明确一下需求,网页端点击一下button,传递特定的参数到download.jsp网页,筛选文件,对过滤得到的文件进行压缩,然后返回前端一个压缩包下载. 以下的代 ...

  8. 转:PHP 使用ZipArchive压缩文件并下载

    原文来自于:http://courages.us/archives/176 网站上需要提供一些打印数据给用户下载,这些文件每次都需要重新生成,因为随时都会有新的数据产生.网络上关于PHP的压缩功能实现 ...

  9. Java解压和压缩带密码的zip或rar文件(下载压缩文件中的选中文件、向压缩文件中新增、删除文件)

    JAVA 实现在线浏览管理zip和rar的工具类 (有密码及无密码的)以及下载压缩文件中的选中文件(向压缩文件中新增.删除文件) 这是之前的版本 JAVA 解压压缩包中指定文件或实现压缩文件的预览及下 ...

随机推荐

  1. 4.Web工程师的开发工具箱

    第四章 效率工具ShadowSocks window代理服务器FalconProxy chrome代理服务器stackoverflow.com Stack Overflow是一个与程序相关的IT技术问 ...

  2. TensorFlow框架(4)之CNN卷积神经网络详解

    1. 卷积神经网络 1.1 多层前馈神经网络 多层前馈神经网络是指在多层的神经网络中,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接的情况,如图 11所示. 图 11 对 ...

  3. BZOJ1415 聪聪和可可 —— 期望 记忆化搜索

    题目链接:https://vjudge.net/problem/HYSBZ-1415 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 16 ...

  4. 部署asp.net网站的小问题

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG   web.config  修改 trust level="Full"

  5. Eclipse中导入github上的项目

    Eclipse中导入github上的项目 转载至: http://blog.csdn.net/hil2000/article/details/8566456 1.首先在github.com上申请一个账 ...

  6. ffmpeg给视频加文字水印

    ffmpeg -i dd2800.mp4 -vf "drawtext=fontfile=Arial.ttf: text='Hu':x=100:y=10:fontsize=24:fontcol ...

  7. Java丨springMVC + Ajax 来进行分页

    javaweb 分页技术 实现的方式有很多种,但是小编在网上问了度娘也问了谷老师,得到的答案让小编我不是很满意,so,还是自己写吧! 在小编的博文中,小编不会上传源码,只会把重要的代码和思路供大家参考 ...

  8. win32com操作word(1):几个重要的对象(28.35)

    Pywin32模块为python封装了操作windows底层API函数的功能.而win32com是Pywin32下面的一个模块,专门负责操作com组件. 由于office工具(Word.Excel等) ...

  9. 001-Bootstrap栅格系统

    1 安装和基本使用 外文官网 中文官网 可以正常下载使用 有三个文件夹, 分别是css, fonts, js bootstrap/ ├── css/ │ ├── bootstrap.css │ ├── ...

  10. appium 特殊操作

      一.触摸操作   1.driver.tap([坐标],持续点击时间) 除了定位到元素的点击外,也可以通过tab实现坐标的点击 driver.tap(driver.tap([(216,1776)], ...