php实现文件下载代码分享


Posted in PHP onAugust 19, 2014

简单的文件下载只需要使用HTML的连接标记<a>,并将属性href的URL值指定为下载的文件即可。所示:

<a href=”https://3water.com/download/book.rar”>下载文件</a>

如果通过上面的代码实现文件下载,只能处理一些浏览器不能默认识别的MIME类型文件,例如当访问book.rar文件时,浏览器并没有直接打开,而是弹出一个下载提示框,提示用户“下载”还是“打开”等处理方式。但如果需要下载后缀名为.html的网页文件、图片文件及PHP程序脚本文件等,使用这种连接形式,则会将文件内容直接输出到浏览器中,并不会提示用户下载。

为了提高文件的安全性,不希望在<a>标签中给出文件的链接,则必须向浏览器发送必要的头信息,以通知浏览器将要进行下载文件的处理。PHP使用header()函数发送网页的头部信息给浏览器,该函数接收一个头信息的字符串作为参数。文件下载需要发送的头信息包括以下三部分,通过调用三次header()函数完成。以下载图片test.gif为例,需要发送的头信息的所示:

header(‘Content-Type:imge/gif'); //发送指定文件MIME类型的头信息
header(‘Content-Disposition:attachment; filename=”test.gif”‘); //发送描述文件的头信息,附件和文件名
header(‘Content-Length:3390′); //发送指定文件大小的信息,单位字节

如果使用header()函数向浏览器发送了这三行头信息,图片test.gif就不会直接在浏览器中显示,而让浏览器将该文件形成下载的形式。在函数header()中,“Content-Type”指定了文件的MIME类型,“Content_Disposition”用于文件的描述,值“attachment; filename=”test.gif””说明这是一个附件,并且指定了下载后的文件名,“Content_Length”则给出了被下载文件的大小。

设置完头部信息以后,需要将文件的内容输出到浏览器,以便进行下载。可以使用PHP中的文件系统函数将文件内容读取出来后,直接输出给浏览器。最方便的是使用readfile()函数,将文件内容读取出来直接输出。下载文件test.gif的所示:

<?php
$filename = "test.gif";
header('Content-Type:image/gif'); //指定下载文件类型
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述
header('Content-Length:'.filesize($filename)); //指定下载文件的大小
 
//将文件内容读取出来并直接输出,以便下载
readfile($filename);
?>

上面如果碰到中文名字就会无法正常下载了,对于中文名字下载文件我又找到一个文件下载实例代码
 

<?php 
header("Content-type:text/html;charset=utf-8"); 
// $file_name="cookie.jpg"; 
$file_name="圣诞狂欢.jpg"; 
//用以解决中文不能显示出来的问题 
$file_name=iconv("utf-8","gb2312",$file_name); 
$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/"; 
$file_path=$file_sub_path.$file_name; 
//首先要判断给定的文件存在与否 
if(!file_exists($file_path)){ 
echo "没有该文件文件"; 
return ; 
} 
$fp=fopen($file_path,"r"); 
$file_size=filesize($file_path); 
//下载文件需要用到的头 
Header("Content-type: application/octet-stream"); 
Header("Accept-Ranges: bytes"); 
Header("Accept-Length:".$file_size); 
Header("Content-Disposition: attachment; filename=".$file_name); 
$buffer=1024; 
$file_count=0; 
//向浏览器返回数据 
while(!feof($fp) && $file_count<$file_size){ 
$file_con=fread($fp,$buffer); 
$file_count+=$buffer; 
echo $file_con; 
} 
fclose($fp); 
?>

header("Content-type:text/html;charset=utf-8")的作用:在服务器响应浏览器的请求时,告诉浏览器以编码格式为UTF-8的编码显示该内容

关于file_exists()函数不支持中文路径的问题:因为php函数比较早,不支持中文,所以如果被下载的文件名是中文的话,需要对其进行字符编码转换,否则file_exists()函数不能识别,可以使用iconv()函数进行编码转换

$file_sub_path() 我使用的是绝对路径,执行效率要比相对路径高

Header("Content-type: application/octet-stream")的作用:通过这句代码客户端浏览器就能知道服务端返回的文件形式 
Header("Accept-Ranges: bytes")的作用:告诉客户端浏览器返回的文件大小是按照字节进行计算的 
Header("Accept-Length:".$file_size)的作用:告诉浏览器返回的文件大小 
Header("Content-Disposition: attachment; filename=".$file_name)的作用:告诉浏览器返回的文件的名称

以上四个Header()是必需的
fclose($fp)可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区

PHP 相关文章推荐
PHP define函数的使用说明
Aug 27 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
Jan 14 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 #PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 #PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 #PHP
PHP中单引号与双引号的区别分析
Aug 19 #PHP
php版本的cron定时任务执行器使用实例
Aug 19 #PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 #PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 #PHP
You might like
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
2019/04/28 jQuery
react实现同页面三级跳转路由布局
2019/09/26 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
python3中的md5加密实例
2018/05/29 Python
python3学生名片管理v2.0版
2018/11/29 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python 求定积分和不定积分示例
2019/11/20 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python如何测试stdout输出
2020/08/10 Python
如何用python免费看美剧
2020/08/11 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
国庆节文艺活动方案
2014/02/03 职场文书
装饰活动策划方案
2014/02/11 职场文书
2014年创卫实施方案
2014/02/18 职场文书
电影雨中的树观后感
2015/06/15 职场文书
高二英语教学反思
2016/03/03 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
用Python可视化新冠疫情数据
2022/01/18 Python
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技