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 xml留言板 xml存储数据的简单例子
Aug 24 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
php字符串截取函数用法分析
Nov 25 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
PHP简单遍历对象示例
Sep 28 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Python中的tuple元组详细介绍
2015/02/02 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
python tornado修改log输出方式
2019/11/18 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
django从后台返回html代码的实例
2020/03/11 Python
虚拟机下载python是否需要联网
2020/07/27 Python
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
毕业生就业自荐书
2013/12/15 职场文书
教师个人鉴定材料
2014/02/08 职场文书
人民调解员培训方案
2014/06/05 职场文书
2014年药店工作总结
2014/11/20 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL