php 获取文件给用户下载,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
$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();
标签:文件,name,down,mime,file,php,data,下载
来源: https://www.cnblogs.com/xuey/p/10353276.html
php 获取文件给用户下载,php 下载文件/直接下载数据内容相关推荐
- Linux用户和用户组和文件权限介绍
简介 主要介绍linux用户相关的内容: Linux中的用户实质就是一个账号,Linux是一个多用户多任务操作系统,任何一个想要使用系统资源的用户,都必须先向系统管理员要一个账号,然后以这个账号的身份 ...
- linux如何启动文件夹,linux 下常见启动文件配置
在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login或 ~/. ...
- ubuntu下linux:curl使用ftp获取服务器上指定目录的所有文件集合以及下载
curl使用ftp获取服务器上指定目录的所有文件集合以及下载 直接编译可用,注意修改测试main函数内的字符串,注释我觉得写的挺详细了,跑不起来的评论区可问 头文件 #ifndef FTP_DOWNL ...
- c# 用户帐户临时文件夹_注册帐户,上传文件以供批准,以及查看和下载批准的文件
c# 用户帐户临时文件夹 在你开始前 在本系列的第一部分中,您将学习基本PHP语法,形式和功能,以及如何通过PHP应用程序连接和使用MySQL或任何其他数据库. 关于本教程 本教程将引导您使用PHP构 ...
- 如何在内存中创建文件供用户下载,而不是通过服务器下载?
有什么方法可以在客户端上创建文本文件并提示用户下载文本文件,而无需与服务器进行任何交互? 我知道我不能直接写给他们的机器(安全性和全部),但是我可以创建并提示他们保存吗? #1楼 您甚至可以做一个比U ...
- java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现ftp连接.登陆.上传.下载.删除文件.获取目录.文件列表等操作. 本地调试,首先需要在本机上开启ftp服务和ftp站点. 测试代码 ...
- 向微信公众号文章中添加mp4、rar、zip等文件给用户下载
现在随着微信公众号的使用率越来越高 大家对公众号的功能需求也越来越广 假如想在文章中添加一个MP4.rar.zip等压缩文件 让用户来浏览.下载.编辑,就需要通过微附件小程序来实现了 使用微附件小 ...
- iOS 下载开始的时候获取将要下载完成的文件的大小
在NSURLSessionDataDelegate 代理方法中获取将要下载完成的文件的大小expectedContentLength //网络资源下载请求获得响应 - (void)URLSession ...
- 压缩包下载后php文件怎么打开,用户下载的压缩包rar格式或zip文件如何解压 解压后就可以安装或运行里面的文件了...
狸窝网盘中分享有很多解决方案中使用到的软件资源,下载到电脑后是一个软件的文件压缩包,有的用户下载后不知道如何解压或说解压不了,怎么办?由于狸窝所面向用户比较大众化,为方便不同年龄层次和新手的使用,这里 ...
最新文章
- Mongodb监控指标
- MySQL数据类型和Java数据类型对应关系表
- linux bash 字符串 连接,Linux Bash 中字符串操作
- linux系统编程之文件与I/O(六):fcntl 函数与文件锁
- iPhone11翻车了?发烫严重、信号依旧差...
- nexus : maven上传jar包到nexus私服后的存放路径以及保存的数据结构
- 学界 | NLP年度盛宴EMNLP/CoNLL 2018最精彩论文精选(摘要+评论)
- 69篇关于微博的研究论文和报告
- PHP下添加PDO_Pgsql扩展
- Egret + P2物理引擎入门教程
- 实用的智力测试智商提升微信小程序源码下载支持多种流量主
- android ding铃声,Ring a Ding Dong
- 中国石油大学《大学英语(三)统考》第二套模拟题
- 2021年美容师(初级)免费试题及美容师(初级)模拟试题
- css复合选择器(后代选择器、子代选择器、并集选择器、链接伪类选择器、:focus选择器)
- 深度学习第55讲:图像的神经风格迁移
- 这些强大的数据分析软件你都知道吗?
- 礼品卡配合U盘,美国一公司遭受BadUSB真实攻击
- Evilnum恶意组织使用新的基于Python的木马攻击金融公司
- Fast 22 HTMFS: Strong Consistency Comes for Free with Hardware Transactional Memory in Persistent...