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 反向排序和随机排序代码
Jun 30 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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生成html分页列表的代码
2007/03/18 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
js实现中文实时时钟
2020/01/15 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
工厂保安员岗位职责
2014/01/31 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
校园活动宣传方案
2014/03/28 职场文书
个人校本研修方案
2014/05/26 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
python 中yaml文件用法大全
2021/07/04 Python
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
关于Vue中的options选项
2022/03/22 Vue.js
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技