PHP实现打包下载文件的方法示例


Posted in PHP onOctober 07, 2017

本文实例讲述了PHP实现打包下载文件的方法。分享给大家供大家参考,具体如下:

/**
* 下载文件
* @param $img
* @return string
*/
public function Download($img)
{
    $items = [];
    $names = [];
    if($img)
    {
      //用于前端跳转zip链接拼接
      $path_redirect = '/zip/'.date('Ymd');
      //临时文件存储地址
      $path      = '/tmp'.$path_redirect;
      if(!is_dir($path))
      {
        mkdir($path, 0777,true);
      }
      foreach ($img as $key => $value) {
        $fileContent = '';
        $fileContent = $this->CurlDownload($value['url']);
        if( $fileContent )
        {
          $__tmp = $this->SaveFile( $value['url'] , $path , $fileContent );
          $items[] = $__tmp[0];
          $names[] = $value['name'].'_'.($key+1).'.'.$__tmp[1];
        }
      }
      if( $items )
      {
        $zip = new ZipArchive();
        $filename = time().'download.zip';
        $zipname = $path.'/'.$filename;
        if (!file_exists($zipname)) {
          $res = $zip->open($zipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
          if ($res) {
            foreach ($items as $k => $v) {
              $value = explode("/", $v);
              $end  = end($value);
              $zip->addFile($v, $end);
              $zip->renameName($end, $names[$k]);
            }
            $zip->close();
          } else {
            return '';
          }
          //通过前端js跳转zip地址下载,让不使用php代码下载zip文件
          //if (file_exists($zipname)) {
            //拼接附件地址
            //$redirect = 域名.$path_redirect.'/'.$filename;
            //return $redirect;
            //header("Location:".$redirect);
          //}
          //直接写文件的方式下载到客户端
          if (file_exists($zipname)) {
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header('Content-disposition: attachment; filename=附件.zip'); //文件名
            header("Content-Type: application/zip"); //zip格式的
            header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
            header('Content-Length: ' . filesize($zipname)); //告诉浏览器,文件大小
            @readfile($zipname);
          }
          //删除临时文件
          @unlink($zipname);
        }
      }
      return '';
    }
}
/**
* curl获取链接内容
* @param $url
* @return mixed|string
*/
public function CurlDownload($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $errno   = curl_errno($ch);
    $error   = curl_error($ch);
    $res=curl_exec($ch);
    curl_close($ch);
    if($errno>0){
      return '';
    }
    return $res;
}
/**
* 保存临时文件
* @param $url
* @param $dir
* @param $content
* @return array
*/
public function SaveFile( $url ,$dir , $content)
{
    $fname   = basename($url); //返回路径中的文件名部分
    $str_name  = pathinfo($fname); //以数组的形式返回文件路径的信息
    $extname  = strtolower($str_name['extension']); //把扩展名转换成小写
    $path    = $dir.'/'.md5($url).$extname;
    $fp     = fopen( $path ,'w+' );
    fwrite( $fp , $content );
    fclose($fp);
    return array( $path , $extname) ;
}

引用:

$img = [['url'=>'地址url/1.jpg','name'=>'名字']];
Download($img);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
PHP链表操作简单示例
Oct 15 PHP
php常用正则函数实例小结
Dec 29 PHP
如何离线执行php任务
Feb 21 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP日期和时间函数的使用示例详解
Aug 06 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 #PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 #PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 #PHP
php判断文件上传图片格式的实例详解
Sep 30 #PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 #PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 #PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 #PHP
You might like
PHP文件操作实现代码分享
2011/09/01 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
python计算圆周率pi的方法
2015/07/11 Python
python Flask实现restful api service
2017/12/04 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python之yield和Generator深入解析
2019/09/18 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
公司端午节活动方案
2014/02/04 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
群众路线调研报告范文
2014/11/03 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL