php 下载文件/直接下载数据内容

思路步骤

 * 定义参数 * 魔术方法 * 执行下载 * 获取设置属性函数 *      获取设置文件mime 类型 *      获取设置下载文件名 * 设置header * 下载函数

实现代码

class DownFile{

    // 定义参数
    public $data; // 下载的数据或文件名
    public $is_con=false; // 是否是下载内容
    public $down_file_name; // 下载后的文件名
    public $mime_type;        //下载时设置的文件类型
    public $file_del=false; // 下载完成后是否删除服务器文件
    private $file_ext=‘octet-stream‘; // 下载文件时设置的默认文件后缀(获取不到文件类型时设置)
    private $default_mime_type=‘application/‘; // 下载时设置的默认文件类型

    // 魔术方法-- 对象参数赋值
    public function __get($name)
    {
        return $this->name;
    }

    public function __set($name,$value)
    {
        if(!isset($this->name))
        {
           exit("no is $name attr");
        }
        $this->name = $value;
    }

    public function __isset($name)
    {
        return isset($this->name);
    }

    // 执行下载
    public function output($data=null,$down_file_name=null,$is_con=null)
    {
        // 初始化赋值基本数据
        if(!empty($data))
            $this->data=$data;

       if(isset($is_con))
           $this->is_con=$is_con;

        // 如果下载的不是数据 并且不是文件 抛出异常
        if (!$this->is_con && !is_file($this->data)) {
            throw new Exception(‘file not exists:‘ . $this->data);
        }
        ob_end_clean();

        // 下载文件名
        $this->down_file_name($down_file_name);

        if($this->is_con)
        {
            $this->mime_type=$this->default_mime_type.$this->file_ext;
            $file_size=strlen($this->data);
            $this->header($file_size);

            // 如果数据量过多建议 while 方式输出
            /*$read_size=0;
            $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
            while ($read_size<=$file_size)
            {
                echo substr($this->data,$read_size,$buffer);
                $read_size+=$buffer;
            }*/
            // 如果数据量小使用以下方式输出
            echo $this->data;

        }else if(is_file($this->data))
        {
            $this->get_mime_type();
            $this->down_file(filesize($this->data));
        }
    }

    // 获取设置文件mime 类型
    private function get_mime_type()
    {
        if(empty($this->mime_type))
        {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $this->mime_type=finfo_file($finfo, $this->data);
            if(empty($this->mime_type))
                $this->mime_type=$this->default_mime_type.$this->file_ext;
        }
    }

    // 获取设置下载文件名
    private function down_file_name($down_file_name)
    {
        if(!empty($down_file_name))
            $this->down_file_name=$down_file_name;
        else
        {
            if(empty($this->down_file_name))
                $this->down_file_name=time().$this->file_ext;
        }
    }

    // 设置header
    private function header($f_size)
    {
        header("Content-type:".$this->mime_type);
        header("Accept-Ranges:bytes");
        header("Accept-Length:".$f_size);
        header("Content-Disposition:attachment;filename=".$this->down_file_name);
        header("Content-Transfer-Encoding:binary");
        header("Cache-Control:no-cache,no-store,max-age=0,must-revalidate");
        header("Pragma:no-cache");
    }

    // 下载文件函数
    private function down_file($f_size)
    {
        $this->header($f_size);
        if(!$this->file_del)
        {
            // 如果文件过大建议使用 while 方式读取输出
            /*$fp=fopen($this->data,"r");
            $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
            while(!feof($fp))
            {
                $file_con=fread($fp,$buffer); // fread 指针自动下移
                echo $file_con;
            }
            fclose($fp);*/

            // 如果数据量小直接输出
            readfile($this->data);
        }else
        {
            $fp=fopen($this->data,"r");
            $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
            $file_count=0; //读取的总字节数
            //向浏览器返回数据
            while(!feof($fp) && $file_count<$f_size){
                $file_con=fread($fp,$buffer);
                $file_count+=$buffer;
                echo $file_con;
            }
            fclose($fp);
            //下载完成后删除压缩包,临时文件夹
            if($file_count >= $f_size)
            {
                @unlink($this->data);
            }
        }
    }
}

调用示例

$f=new DownFile();
//$f->output(‘1.png‘,‘2.png‘); // 参数调用-- 下载文件
//$f->output(‘测试数据下载直接生成文件‘,‘2.txt‘,true); // 参数调用-- 下载数据直接生成文件

// 对象方式调用
/*$f->data=‘1.html‘;
$f->down_file_name=‘2.html‘;
//$f->file_del=true;  // 下载完成后删除服务器远程文件
$f->output();*/

$f->data=‘对象方式调用‘.PHP_EOL.‘测试数据下载直接生成文件‘;
$f->down_file_name=‘2.txt‘;
$f->is_con=true;
$f->output();

原文地址:https://www.cnblogs.com/xuey/p/10353276.html

时间: 2024-08-03 19:18:07

php 下载文件/直接下载数据内容的相关文章

AFHTTPSessionManager下载文件 及下载中 进度条处理,进度条处理需要特别注意,要加载NSRunLoop 中

1.下载文件 和进度条处理代码 - (void)timer:(NSTimer *)timer{ // 另一个View中 进度条progress属性赋值 _downloadView.progress = self.pressing; if (self.pressing >= 1.0) { [timer invalidate]; } } -(void)downloadWithUrlString:(NSString *)urlString { //1.创建会话管理者 AFHTTPSessionMana

django 中下载文件与下载保存为excel

一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. 1.前端 实现方式:a标签+响应头信息(当然你可以选择form实现) <div class="col-md-4"><a href="{% url 'download' %}" rel="external nofollow

关于网页下载文件,使用数据流方式下载

关于文件下载,很多都是用href='文件地址',这样做是很不安全的,所以需要使用到文件流,以下代码用于下载一张图片. Response.BufferOutput = false; Response.Clear(); Response.ContentType = "application/x-msdownload"; Response.AppendHeader("Content-Disposition", "attachment; filename=&quo

访问局域网内指定电脑,下载文件,读取数据

曾经遇到过需要下载服务器内文件到客户机上的情况(ps:服务器机器也是普通的pc),特意查了N多资料,发帖问了很多前辈 WebClient wc = new WebClient();public void Download(string Add, string savePath){  try{ wc.downloadFile(Add,savePath)}  catch{...}  finallly {wc.dispose();} } 实际用处并不大,因为它有个致命的缺点,就是访问别的电脑的时候,需

js下载文件;下载方式&lt;a&gt; 和href方式;已经中文乱码问题

一:先看看各种下载方式: 1. A 标签的方式 : <a target="_Blank" href="<%=basePath %>html/document/GJB/CYBDXZ/文件名.doc">文件名.doc</a> 2. href方式:   function go (name){                                             var url =  encodeURIComponent

c# 模拟表单提交,post form 上传文件、大数据内容

表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每一份资料的边界 (boundary),用以产生多重信息部份 (message part).而 HTTP 服务器可以抓取 HTTP POST 的信息, 基本内容:1. 每个信息部份都要用 --[BOUNDARY_NAME] 来包装,以分隔出信息的每个部份,而最后要再加上一个 --[BOUNDARY_N

通过Java WebService接口从服务端下载文件

一. 前言 本文讲述如何通过webservice接口,从服务端下载文件.报告到客户端.适用于跨系统间的文件交互,传输文件不大的情况(控制在几百M以内).对于这种情况搭建一个FTP环境,增加了系统部署的复杂度和系统对外暴露的接口.通过在服务端读取文件,返回字节流到客户端的方式比较简单. 下面采用restful的接口形式,满足SOA架构接口要求.如下代码拷贝到eclipse中即可运行,功能自测试运行正常.样例代码的服务端和客户端在同一台PC上运行,放到不同PC上运行改一下发布服务和请求服务的IP地址

C# FileStream进行FTP服务上传文件和下载文件

定义FileStream类的操作类:操作类名: FtpUpDown 上传文件 /// <summary> /// 上传文件 /// </summary> /// <param name="localpath">上传文件的全路径 例@"D:\123.txt"</param> /// <param name="ftppath"></param> /// <returns&g

LOADRUNNER上传及下载文件

(1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Referer=https://t