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 获取全局变量的代码
Apr 21 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
Laravel实现用户注册和登录
Jan 23 PHP
php取得字符串首字母的方法
Mar 25 PHP
php生成zip文件类实例
Apr 07 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP通过curl获取接口URL的数据方法
May 31 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
JavaScript类库D
2010/10/24 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python简明入门教程
2015/08/04 Python
用Eclipse写python程序
2018/02/10 Python
python读取xlsx的方法
2018/12/25 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
酒店门卫岗位职责
2013/12/29 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
大学军训感言800字
2014/02/27 职场文书
给市场的环保建议书
2014/05/14 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
爱国影片观后感
2015/06/18 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL