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 相关文章推荐
php.ini 中文版
Oct 28 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php无限极分类实现的两种解决方法
Apr 28 PHP
php实现简单洗牌算法
Jun 18 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
CI配置多数据库访问的方法
Mar 28 PHP
php简单获取复选框值的方法
May 11 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 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
风格模板初级不完全修改教程
2006/10/09 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Jquery实现简单的动画效果代码
2012/03/18 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
Vue router安装及使用方法解析
2020/12/02 Vue.js
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用Python操作excel文件的实例代码
2017/10/15 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
python 画条形图(柱状图)实例
2020/04/24 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
美的官方商城:Midea
2016/09/14 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
大学生求职简历的自我评价
2013/10/14 职场文书
写自荐信的注意事项
2014/03/09 职场文书
2014年师德承诺书
2014/05/23 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
出售房屋协议书范本
2014/10/06 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
结婚保证书
2015/01/16 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
详解MySQL中的pid与socket
2021/06/15 MySQL