思路步骤

* 定义参数

* 魔术方法

* 执行下载

* 获取设置属性函数

* 获取设置文件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 下载文件/直接下载数据内容相关推荐

  1. Linux用户和用户组和文件权限介绍

    简介 主要介绍linux用户相关的内容: Linux中的用户实质就是一个账号,Linux是一个多用户多任务操作系统,任何一个想要使用系统资源的用户,都必须先向系统管理员要一个账号,然后以这个账号的身份 ...

  2. linux如何启动文件夹,linux 下常见启动文件配置

    在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login或 ~/. ...

  3. ubuntu下linux:curl使用ftp获取服务器上指定目录的所有文件集合以及下载

    curl使用ftp获取服务器上指定目录的所有文件集合以及下载 直接编译可用,注意修改测试main函数内的字符串,注释我觉得写的挺详细了,跑不起来的评论区可问 头文件 #ifndef FTP_DOWNL ...

  4. c# 用户帐户临时文件夹_注册帐户,上传文件以供批准,以及查看和下载批准的文件

    c# 用户帐户临时文件夹 在你开始前 在本系列的第一部分中,您将学习基本PHP语法,形式和功能,以及如何通过PHP应用程序连接和使用MySQL或任何其他数据库. 关于本教程 本教程将引导您使用PHP构 ...

  5. 如何在内存中创建文件供用户下载,而不是通过服务器下载?

    有什么方法可以在客户端上创建文本文件并提示用户下载文本文件,而无需与服务器进行任何交互? 我知道我不能直接写给他们的机器(安全性和全部),但是我可以创建并提示他们保存吗? #1楼 您甚至可以做一个比U ...

  6. java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现ftp连接.登陆.上传.下载.删除文件.获取目录.文件列表等操作. 本地调试,首先需要在本机上开启ftp服务和ftp站点. 测试代码 ...

  7. 向微信公众号文章中添加mp4、rar、zip等文件给用户下载

    现在随着微信公众号的使用率越来越高 大家对公众号的功能需求也越来越广   假如想在文章中添加一个MP4.rar.zip等压缩文件 让用户来浏览.下载.编辑,就需要通过微附件小程序来实现了 使用微附件小 ...

  8. iOS 下载开始的时候获取将要下载完成的文件的大小

    在NSURLSessionDataDelegate 代理方法中获取将要下载完成的文件的大小expectedContentLength //网络资源下载请求获得响应 - (void)URLSession ...

  9. 压缩包下载后php文件怎么打开,用户下载的压缩包rar格式或zip文件如何解压 解压后就可以安装或运行里面的文件了...

    狸窝网盘中分享有很多解决方案中使用到的软件资源,下载到电脑后是一个软件的文件压缩包,有的用户下载后不知道如何解压或说解压不了,怎么办?由于狸窝所面向用户比较大众化,为方便不同年龄层次和新手的使用,这里 ...

最新文章

  1. Mongodb监控指标
  2. MySQL数据类型和Java数据类型对应关系表
  3. linux bash 字符串 连接,Linux Bash 中字符串操作
  4. linux系统编程之文件与I/O(六):fcntl 函数与文件锁
  5. iPhone11翻车了?发烫严重、信号依旧差...
  6. nexus : maven上传jar包到nexus私服后的存放路径以及保存的数据结构
  7. 学界 | NLP年度盛宴EMNLP/CoNLL 2018最精彩论文精选(摘要+评论)
  8. 69篇关于微博的研究论文和报告
  9. PHP下添加PDO_Pgsql扩展
  10. Egret + P2物理引擎入门教程
  11. 实用的智力测试智商提升微信小程序源码下载支持多种流量主
  12. android ding铃声,Ring a Ding Dong
  13. 中国石油大学《大学英语(三)统考》第二套模拟题
  14. 2021年美容师(初级)免费试题及美容师(初级)模拟试题
  15. css复合选择器(后代选择器、子代选择器、并集选择器、链接伪类选择器、:focus选择器)
  16. 深度学习第55讲:图像的神经风格迁移
  17. 这些强大的数据分析软件你都知道吗?
  18. 礼品卡配合U盘,美国一公司遭受BadUSB真实攻击
  19. Evilnum恶意组织使用新的基于Python的木马攻击金融公司
  20. Fast 22 HTMFS: Strong Consistency Comes for Free with Hardware Transactional Memory in Persistent...

热门文章

  1. Java 9:流API的增强
  2. JSON处理1.1:100DaysOfJavaEE8
  3. 枚举:如何正确使用name()和toString()方法
  4. 将Infinispan版本映射为最低Java版本
  5. Intellij IDEA社区版中的SpringBoot入门
  6. nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述
  7. JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)
  8. 使用Java将数据流式传输到HPCC
  9. 每个客户使用Jersey处理的Cookie
  10. RabbitMQ –使用Spring集成Java DSL串行处理消息