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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jar Hell变得轻松–用jHades揭开类路径的神秘面纱

Java开发人员将不得不面对的最困难的问题是类路径错误&#xff1a; ClassNotFoundException &#xff0c; NoClassDefFoundError &#xff0c;Jar Hell&#xff0c; Xerces Hell和公司。 在本文中&#xff0c;我们将探究这些问题的根本原因&#xff0c;并了解最小的工具&#…

韩顺平php教程笔记,PHP笔记,韩顺平php笔记_PHP教程

PHP笔记&#xff0c;韩顺平php笔记Mysql-----------------------------------------------------------------------------Mysql 改默认密码update mysql.user set PasswordPASSWORD(123456) WHERE UserrootFLUSH PRIVILEGES去了解下MYSQL的范式、反范式、混合范式还有索引的建…

php键盘输入函数,php的常用输入语句以及常用函数

这篇文章主要介绍了关于php的常用输入语句以及常用函数&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下一、 echo语句echo做php的人在熟悉不过了&#xff0c;在php文件中我们用他来输出数据。<?php echo "hi mm"…

分度器中硒定位器的完整指南(示例)

在测试网站的功能时&#xff0c;特别是Web元素&#xff08;例如单选按钮&#xff0c;文本框&#xff0c;下拉列表等&#xff09;&#xff0c;您需要确保能够访问这些元素。 Selenium定位器正是出于这个目的&#xff0c;通过使用此命令&#xff0c;我们可以识别这些Web元素DOM&a…

ajax php 投票,PHP 实例 AJAX 投票

PHP 实例 - AJAX 投票AJAX 投票在下面的实例中&#xff0c;我们将演示一个投票程序&#xff0c;通过它&#xff0c;投票结果在网页不进行刷新的情况下被显示。你喜欢 PHP 和 AJAX 吗?是:否:实例解释 - HTML 页面当用户选择上面的某个选项时&#xff0c;会执行名为 "getVo…

wildfly管理控制台_WildFly 9 –别希望您的控制台像这样!

wildfly管理控制台每个人都可能听到这个消息。 周一发布了第一个WildFly 9.0.0.Alpha1版本。 您可以从wildfly.org网站上下载它&#xff0c;最大的变化是它是由一个新的功能配置工具构建的&#xff0c;该工具位于现在单独的核心发行版上&#xff0c;还包含一个新的Servlet发行版…

azure mysql sql,UiPath连接Azure Sql Server数据库

一、创建数据库在Azure中创建SQL数据库image更改防火墙设置&#xff0c;并设置客户端IP访问规则image二、安装数据源驱动在本地安装数据源驱动程序&#xff0c;保证可以正常接入到远程的数据库。如果不安装驱动程序&#xff0c;则会出现以下报错&#xff1a;[Microsoft][ODBC D…

Spring Boot删除嵌入式Tomcat服务器,启用Jetty服务器

快速指南&#xff0c;在Spring Boot应用程序中排除嵌入式tomcat服务器并添加Jetty Server。 配置删除tomcat并添加Jetty Server。 1.简介 在本教程中&#xff0c;我们将学习如何从Spring Boot应用程序中删除Tomcat服务器 。 实际上&#xff0c;一旦我们添加了“ spring-boot-s…

java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题

SSM中 Spring MVC配置传统的web.xml配置web.xmlcontextConfigLocationclasspath*:applicationContext.xmlorg.springframework.web.context.ContextLoaderListenerencodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/*SpringMV…

java 并发的原子性_Java并发教程–原子性和竞争条件

java 并发的原子性原子性是多线程程序中的关键概念之一。 我们说一组动作是原子的&#xff0c;如果它们都以不可分割的方式作为单个操作执行。 认为多线程程序中的一组操作将被串行执行是理所当然的&#xff0c;可能会导致错误的结果。 原因是由于线程干扰&#xff0c;这意味着…

linux 误删除mysql表能恢复吗,Linux误删数据恢复

引子指在键上飘&#xff0c;难免会湿手套。当你按下shiftdel键后&#xff0c;会不会突然心里凉透&#xff0c;当你执行rm -rf后&#xff0c;会不会马上去搜索哪个国家入境不需要签证。或者你还会遇到如下的情况&#xff1a;root4xem7:~# aliasalias cdrm -rfalias ddocker数据恢…

Apache Camel 3.1 –更多骆驼核心优化(第3部分)

我以前曾在博客中介绍过我们在下一个Camel 3.1版本中所做的优化 博客第1部分 博客第2部分 今天&#xff0c;我想简短介绍一下我们已经完成的最新开发&#xff0c;因为我们准备在本周末或下半年准备好构建和发布Camel 3.1。 从第2部分开始&#xff0c;我们设法在路由过程中将…

mysql error 1114,mysql error 1114 table is full 处理分享

问题描述&#xff1a;一、早上上班收到报警&#xff0c;用户中心某slave不同步。二、查看情况&#xff0c;发现mysql error 1114&#xff0c;The table ‘xxxx’ is full 。。。。。三、检查其他slave&#xff0c;都出现同样问题。四、解决问题方案1、网上解决方案a、修改tmp_…

jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览

jvm jinfo 参数在最近的一些博客中&#xff08;特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书中的评论中&#xff09;&#xff0c;我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是&#xff0c;我从来没有专门解决过漂亮的jinfo工具&#…

matlab int 积不出,matlab – 点积:*命令与循环给出不同的结果

我在Matlab,z和beta中有两个向量.矢量z是117&#xff1a;1 0.430742139435890 0.257372971229541 0.0965909090909091 0.694329541928697 0 0.394960106863064 0 0.100000000000000 1 0.264704325268675 0.387774594078319 0.269207605609567 0.472226643323253 0.750000000000…

49自动化测试中最常见的硒异常

开发人员将始终在编写代码时牢记不同的场景&#xff0c;但是在某些情况下&#xff0c;实现可能无法按预期工作。 相同的原则也适用于测试代码&#xff0c;该代码主要用于测试现有产品的功能&#xff0c;发现错误以及使产品100&#xff05;不受错误影响。 正确地说&#xff0c;…

鹰式价差matlab,鹰式期权:什么叫铁鹰式期权组合,蝶式价差期权?

蝶式期权套利 是利用 交割月份的价差进行 套期获利&#xff0c; 个方向相 反、 共享居中交割月份合约的跨期套利组成。是一种期权策略&#xff0c;风险有限&#xff0c;盈利也有限&#xff0c;是由一手牛市套利和一手熊市套利组合而成的。铁鹰式期权组合是牛市看跌价差期权组合…

angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分

angular8 rest这是Angular JS承诺的Java EE 7的后续版本–第1部分 。 花了比我预期更长的时间&#xff08;找到时间来准备代码和博客文章&#xff09;&#xff0c;但是终于到了&#xff01; 应用程序 第1部分中的原始应用程序只是带有分页的简单列表&#xff0c;以及提供列表数…

php如果字符串有1 3 5,Day3-php 字符串1

字符串是由一系列字符组成&#xff0c;在PHP中&#xff0c;字符和字节一样&#xff0c;也就是说&#xff0c;一共有256种不同字符的可能性。1、字符串 定义方法字符串型可以用三种方法定义&#xff1a;单引号形式、双引号形式和Heredoc结构形式。单引号&#xff1a;不会解析变量…

带有Java Pojo作为输入输出示例的AWS Lambda函数

在上一教程中&#xff0c;我们看到了如何使用Java创建AWS Lambda函数&#xff0c;并传递了String作为输入&#xff0c;还返回了String作为Output。如果您是第一次创建lambda函数&#xff0c;我建议先阅读该教程。 在本教程中&#xff0c;我们将看到如何传递Java普通的旧Java对…