思路步骤

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

最新文章

  1. jqueryUI弹出框问题
  2. WinForm添加快捷键
  3. OpenStack overview 笔记
  4. Cv运动分析与对象跟踪(转)
  5. Android开发-API指南-&lt;manifest&gt;
  6. 异步JS:$.Deferred的使用
  7. C++ Primer 5th 第15章 面向对象程序设计
  8. 导出EXCEL(转转)
  9. AngularJS1
  10. JS理解之闭包
  11. 【面试笔试算法】Program 3 : Complicated Expression(网易游戏笔试题)
  12. BZOJ_1975_[Sdoi2010]魔法猪学院_A*
  13. js的七大设计原则--迪米特原则
  14. Navicat for MySQL 安装和破解
  15. Java多线程(一)多线程基础
  16. C++ - 定义无双引号的字符串宏
  17. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程
  18. Delphi7调用DelphiXE编写的DLL问题
  19. python xlsxwriter写excel并操作各种格式属性
  20. nanosleep()

热门文章

  1. CHANGE DETECTION IN ANGULAR 2
  2. 使用js/jquery查找iframe中的
  3. Shell编程-04-Shell中变量数值计算
  4. [转]快速入门系列--WebAPI--01基础
  5. 无线破解那点事(PJ)
  6. WinExec打开exe文件
  7. task3:词频统计
  8. 二段Linq Groupby操作
  9. 简单的ListView中item图片异步加载
  10. HTML5和App之争论