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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
php 函数中使用static的说明
Jun 01 PHP
php使用curl访问https示例分享
Jan 17 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
PHP时间和日期函数详解
May 08 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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相关资料
2006/10/09 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
sails框架的学习指南
2014/12/22 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
python解析html开发库pyquery使用方法
2014/02/07 Python
python实现定制交互式命令行的方法
2014/07/03 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Python地图绘制实操详解
2019/03/04 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python编写计算器功能
2019/10/25 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
编辑个人求职信范文
2013/09/21 职场文书
环境科学毕业生自荐信
2013/11/21 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
入党政审材料范文
2014/12/24 职场文书
体育教师研修感悟
2015/11/18 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL