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生成随机密码的三种方法小结
Sep 04 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
php中的比较运算符详解
Oct 28 PHP
PHP中常用的输出函数总结
Sep 22 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
详解PHP 二维数组排序保持键名不变
Mar 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+DBM的同学录程序(4)
2006/10/09 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python logging模块用法示例
2018/08/28 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
2014年情人节活动方案
2014/02/16 职场文书
室内设计专业自荐信
2014/05/31 职场文书
最新离婚协议书范本
2014/08/19 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
《所见》教学反思
2016/02/23 职场文书
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang