思路步骤

 * 定义参数
* 魔术方法
* 执行下载
* 获取设置属性函数
* 获取设置文件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();

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

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

    一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...

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

    1.下载文件 和进度条处理代码 - (void)timer:(NSTimer *)timer{ // 另一个View中 进度条progress属性赋值 _downloadView.progress = ...

  3. 01_基于TCP的循环为同一个客户端下载文件的下载器

    原版: TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务. 改良版: TCP分为客户端(client)和服务器(server), (1)每次服务器能为 ...

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

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  5. c#导出文件,下载文件,命名下载后的文件名

    Page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpU ...

  6. selenium 下载文件设置下载路径

    Chrome 文件下载 Chrome浏览器类似,设置其options: download.default_directory:设置下载路径 profile.default_content_settin ...

  7. UWP 下载文件显示下载进度

    <Page x:Class="WgscdProject.TestDownloadPage" xmlns="http://schemas.microsoft.com/ ...

  8. ajaxsubmit 上传文件 在IE中返回的内容 提示下载文件

    在ajaxSubmit提交表单的时候,如果表单内有文件上传的话,会判断参数是否配置的iframe为false参数,如果没有,会用创建隐藏iframe方式提交表单,如果设定了iframe为false,则 ...

  9. python下载文件(图片)源码,包含爬网内容(爬url),可保存cookie

    #coding=utf-8 ''' Created on 2013-7-17 @author: zinan.zhang ''' import re import time import httplib ...

随机推荐

  1. 如何求数字n的因数个数及因数和

    我们有可能在某些数学题中会求到某个数的因数和,那我们怎么求呢? 因为我们知道任意一个合数都可以由两个或多个质数相乘得到,那么我们就先分解质因数吧 例:我们随便去一个数吧,嗯,就108了,好算... 我 ...

  2. oracle 查询死锁

    --查询死锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked ...

  3. Jakarta Commons Cookbook

      Cookbook就是工具书,应该是前年看的,在中关村看的影印版,全英文,本书主要讲解了一下模块: Core:BeanUtils,Lang,Collections,logging Db:DbUtil ...

  4. KbmMW 4.40.00 测试发布

    经过漫长的等待,支持移动开发的kbmmw 4.40.00 终于发布了,这次不但支持各个平台的开发, 而且增加了认证管理器等很多新特性,非常值得升级.具体见下表. 4.40.00 BETA 1 Oct ...

  5. spring 启动完成后事件监听器处理

    有时候我们在spring容器启动完成后,我们需要做一些处理动作,这个时候怎么做呢? spring提供了事件监听器的处理机制. spring提供了内置的几类的事件: ContextClosedEvent ...

  6. jmeter 计数器 (可自动生成新数字、注册专用)

    1.打开jmeter,创建好线程组后,添加计数器 2.设置计数器 3.添加HTTP请求,验证所设置的计数器 4.填写对应参数 5.添加查看结果树,查看结果 6.修改一下线程属性 7.跑一下,看下结果就 ...

  7. hdu2364之BFS

    Escape Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. Android-快速查找索引篇

    01.Android-UI汇总 01.Android-TextView跑马灯效果 02.Android-Activity 01.Test 03.Android-数据存储 01.Test 04.Andr ...

  9. AngularJS Backbone.js Ember.js 对比

    看到一篇关于AngularJS Backbone Ember.js的对比,建议看一看 说说个人的观点(本人学艺不精,只是个人的观点,不保证观点完全正确,请轻拍): backbone.js 短小精悍,非 ...

  10. 2:C#TPL探秘

    理论: 1. 只要方法是 Task类型的返回值,都可以用 await 来等待调用获取返回值. 2. 如果一个返回 Task类型的方法被标记了 async,那么只要方法内部直接 return T 这个 ...