最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Thinkphp6如何利用ZipArchive打包下载文件

来源:动视网 责编:小采 时间:2020-11-02 18:26:56
文档

Thinkphp6如何利用ZipArchive打包下载文件

Thinkphp6如何利用ZipArchive打包下载文件: 下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!基础环境系统环境:Windows10 xPHP集成环境:phpstudyPHP依赖管理工具:Composer手册:Thinkphp(一) 下载tp6框架compo
推荐度:
导读Thinkphp6如何利用ZipArchive打包下载文件: 下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!基础环境系统环境:Windows10 xPHP集成环境:phpstudyPHP依赖管理工具:Composer手册:Thinkphp(一) 下载tp6框架compo


下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!

  • 基础环境
  • 系统环境:Windows10 x
  • PHP集成环境:phpstudy
  • PHP依赖管理工具:Composer
  • 手册:Thinkphp
  • (一) 下载tp6框架

    composer create-project topthink/think tp6

    (二)打包下载类

    <?php
     namespace Jrk;
    
     class Zipdown
     {
     /**
     * 打包压缩文件及文件夹
     *
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:20:06
     * @param array $files
     * @param string $zipName 压缩包名称
     * @param boolean $wen 
     * @param boolean $isDown
     * @return void
     */ 
     public function zip_file($files = [], $zipName = '', $wen = true,$isDown = true){
    
     $zip_file_path='zip/';
     // 文件名为空则生成文件名
     if (empty($zipName)) {
     $zipName = $zip_file_path.date('YmdHis') . '.zip';
     }else{
     $zipName=$zip_file_path.$zipName.'.zip';
     }
    
     // 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
     $zip = new ipArchive;
     /*
     * 通过ZipArchive的对象处理zip文件
     * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
     * $zip->open这个方法第一个参数表示处理的zip文件名。
     * 这里重点说下第二个参数,它表示处理模式
     * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
     * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
     * */
     if ($zip->open($zipName, IPARCHIVE::OVERWRITE | IPARCHIVE::CREATE) !== true) {
     exit('无法打开文件,或者文件创建失败');
     }
    
     // 文件夹打包处理
     if (is_string($files)) {
     // 文件夹整体打包
     $this->addFileToZip($files, $zip);
     } else {
     // 文件打包
     foreach ($files as $val) {
     if(file_exists(app()->getRootPath().'public'.$val['att_dir'])){
     if($wen){
     //根据存储的文件夹打包分层
     $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));
     }else{
     //不分层
     $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));
     }
     }
     }
     }
     // 关闭
     $zip->close();
    
     // 验证文件是否存在
     if (!file_exists($zipName)) {
     exit("文件不存在");
     }
    
     if ($isDown) {
     // ob_clean();
     // 下载压缩包
     header("Cache-Control: public");
     header("Content-Description: File Transfer");
     header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名
     header("Content-Type: application/zip"); //zip格式的
     header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
     header('Content-Length: ' . filesize($zipName)); //告诉浏览器,文件大小
     @readfile($zipName);//ob_end_clean();
     @unlink(app()->getRootPath().'public/'.$zipName);//删除压缩包
    
     } else {
     // 直接返回压缩包地址
     return $zipName;
     }
     }
    
     /**
     * 添加文件至压缩包
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:20:26
     * @param [type] $path
     * @param [type] $zip
     * @return void
     */ 
     public function addFileToZip($path, $zip)
     {
     // 打开文件夹
     $handler = opendir($path);
     while (($filename = readdir($handler)) !== false) {
     if ($filename != "." && $filename != "..") {
     // 编码转换
     $filename = iconv('gb2312', 'utf-8', $filename);
     // 文件夹文件名字为'.'和‘..’,不要对他们进行操作
     if (is_dir($path . "/" . $filename)) {
     // 如果读取的某个对象是文件夹,则递归
     $this->addFileToZip($path . "/" . $filename, $zip);
     } else {
     // 将文件加入zip对象
     $file_path = $path . "/" . $filename;
     $zip->addFile($file_path, basename($file_path));
     }
     }
     }
     // 关闭文件夹
     @closedir($path);
     }
    
     /**
     * 压缩文件解压
     *
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:23:11
     * @param [type] $file
     * @param [type] $dirname
     * @return void
     */
     public function unzip_file($file, $dirname)
     {
     if (!file_exists($file)) {
     return false;
     }
     // zip实例化对象
     $zipArc = new ipArchive();
     // 打开文件
     if (!$zipArc->open($file)) {
     return false;
     }
     // 解压文件
     if (!$zipArc->extractTo($dirname)) {
     // 关闭
     $zipArc->close();
     return false;
     }
     return $zipArc->close();
     }
     }

    (三)使用,亲测有效

     /**
     * @author: Hhy <jackhhy520@qq.com>
     * @date: 2020/7/2 0002
     * @describe:打包下载
     */
     public function download(){
     $id= $this->request->param("id");
     if (is_array($id)){
     $ids=$id;
     }else{
     $ids=@explode(",",$id);
     }
     $data=$this->model->where('id', 'in',$ids)->select()->toArray();
     //dd($data);
    
     if (empty($data)) {
     $this->error("暂无数据");
     }
     $zip=new Jrkipdown();
     //打包下载
     $zip->zip_file($data);
     }

    文档

    Thinkphp6如何利用ZipArchive打包下载文件

    Thinkphp6如何利用ZipArchive打包下载文件: 下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!基础环境系统环境:Windows10 xPHP集成环境:phpstudyPHP依赖管理工具:Composer手册:Thinkphp(一) 下载tp6框架compo
    推荐度:
    标签: 文件夹 打包 php
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top