思路步骤

 * 定义参数
* 魔术方法
* 执行下载
* 获取设置属性函数
* 获取设置文件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. libevent 简单学习

    //NetworkManager.h #ifndef _NET_WORK_MANAGER_ #define _NET_WORK_MANAGER_ #include "event2/util. ...

  2. genymotion的安装

    1.安装virtualBox google的模拟器是运行在qemu上面的. genymotion这个模拟器运行在virtualBox上面.

  3. 使用delphi 开发多层应用(二十一)使用XE5 RESTClient 直接访问kbmmw 数据库

    delphi XE5 出来了,增加了android 的开发支持,另外增加了一个RESTClient 来支持访问REST 服务器. 这个功能非常强大,可以直接使用非常多的REST 服务器.同时也可以支持 ...

  4. spring常用接口 InitializingBean的作用

    工作中遇到spring接口中的InitializingBean接口.浅浅的解说一下. --------------------------------------------------------- ...

  5. (最小生成树)Eddy's picture -- hdu -- 1162

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1162 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. 目前主流编译器对C++11特性的支持情况

    目前主流编译器对C++11特性的支持情况 1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行 ...

  7. HTML5 Canvas之猜数字游戏

    主要的内容描述的是如何渲染一个矩形的边框和填充背景,以及文字. 代码中有详细的注释: 效果图: 以下是代码: <!DOCTYPE html> <html lang="cn& ...

  8. 6.nuget安装C#Driver驱动ZooKeeperNet

    一: C# 的Drivers   1. nuget上下载 zookeeper.Net   IWatcher是什么?: client 连接到 server 后,会在server上面注册一个watcher ...

  9. Android-有序广播明确指定接收者

    在上一篇博客,Android-有序广播是可以中断的,介绍了 有序广播是可以中断的,但还有一种例外情况:明确指定接收者的有序广播是无法中断的,一定会发送到指定的接收者 AndroidManifest.x ...

  10. Sql Server中使用存储过程来实现一些时间差的改变

    Sql Server中的时间差是使用DATEDIFF来是现的 语法如下:DATEDIFF(要显示时间格式,开始时间,结束时间) 比如:DATEDIFF(minute,'2019-2-28 8:30', ...