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中取得image按钮传递的name值
Oct 09 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
简单分析ucenter 会员同步登录通信原理
Aug 25 PHP
php验证码实现代码(3种)
Sep 07 PHP
php根据用户语言跳转相应网页
Nov 04 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 PHP
php5与php7的区别点总结
Oct 11 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 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/11/26 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
python找出因数与质因数的方法
2019/07/25 Python
深入浅析Python代码规范性检测
2020/07/31 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
文明礼仪标语
2014/06/13 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
Redis主从复制操作和配置详情
2022/09/23 Redis