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开发文件系统实例讲解
Oct 09 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
php导出excel格式数据问题
Mar 11 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
php上传文件问题汇总
Jan 30 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
pycharm 使用心得(四)显示行号
2014/06/05 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
简单了解什么是神经网络
2017/12/23 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
python实现机器学习之元线性回归
2018/09/06 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
python中return如何写
2020/06/18 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
职工运动会邀请函
2014/02/02 职场文书
员工入职担保书范文
2014/04/01 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
Python字符串格式化方式
2022/04/07 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis