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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
PHP insert语法详解
Jun 07 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
Oct 27 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
Sep 12 PHP
11个PHPer必须要了解的编程规范
Sep 22 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
Yii核心验证器api详解
Nov 23 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
php之可变函数的实例详解
Sep 13 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php接口技术实例详解
2016/12/07 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
vue-cli常用设置总结
2018/02/24 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python tkinter实现屏保程序
2019/07/30 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
大学生村官工作感言
2014/01/10 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
利用Python实现Picgo图床工具
2021/11/23 Python