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 相关文章推荐
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
php浏览历史记录的方法
Mar 10 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 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
How do I change MySQL timezone?
2008/03/26 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php微信开发接入
2016/08/27 PHP
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
Vue异步加载about组件
2017/10/31 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
信息管理员岗位职责
2013/12/01 职场文书
安卓程序员求职信
2014/02/28 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python