思路步骤

 * 定义参数
* 魔术方法
* 执行下载
* 获取设置属性函数
* 获取设置文件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. select获取下拉框的值 下拉框默认选中

    本文主要介绍select下拉框的相关方法. 1.通过id获取下拉框的value和文本值 例如:  <select class="form-control" id=" ...

  2. 数据库查询返回Resource id #9后的处理方式

    如果在调用PHP查询数据库,在echo后返回的是Resource id #9,可能你的输出方式是: $sql="SELECT * FROM dbname WHERE id='1'" ...

  3. CodeForces 687B Remainders Game(数学,最小公倍数)

    题意:给定 n 个数,一个数 k,然后你知道一个数 x 取模这个 n 个的是几,最后问你取模 k,是几. 析:首先题意就看了好久,其实并不难,我们只要能从 n 个数的最小公倍数是 k的倍数即可,想想为 ...

  4. .NET基础 (10)流和序列化

    流和序列化1 什么是流,.NET中有哪些常见的流2 如何使用压缩流3 Serializable特性有何作用4 .NET提供了哪几种可进行序列化操作的类型5 如何自定义序列化和反序列化的过程 流和序列化 ...

  5. underscore概况

    看的是1.3.3,这个版本的中文源码解释比较多. 函数的中文注释:http://www.css88.com/doc/underscore1.5.2/#difference 源码的中文注释:http:/ ...

  6. LINQ to Entity里面不能使用DateTime

    LINQ中不能直接使用DateTime,否则会报错:‘The specified type member 'Date' is not supported in LINQ to Entities. On ...

  7. 浅析C#中的IEquatable<T>接口

    1.引言 首先我们先来看看IEquatable<T>接口的出现解决了什么问题. 我们知道,Object基类的Equals方法存在两个明显的问题.一是缺乏类型安全性,二是对于值类型而言需要装 ...

  8. if、else if 、else及switch...case使用小记(C#)

    有时候编程编的久了,如果不停下来认真思考一下,即便是一些最基础的知识点,也可能让自己懵圈.其实,说到底还是打基础的时候没打牢,或者说自以为是地认为自己懂了,然后在打基础的时候就懒得思考懒得看了,结果就 ...

  9. SharePoint Adventures : Using Claims with Reporting Services

    Cannot convert claims identity to a windows token.  This may be due to user not logging in using win ...

  10. java线程池(一)

    自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池.Integer的共享池.连接数据库的连接池.St ...