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中使用Oracle数据库(6)
Oct 09 PHP
php4的彩蛋
Oct 09 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
PHP可变函数的使用详解
Jun 14 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
PHP使用递归生成文章树
Apr 21 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP图片加水印实现方法
2016/05/06 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
Python3写入文件常用方法实例分析
2015/05/22 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python地震数据可视化详解
2019/06/18 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
python实现大文本文件分割
2019/07/22 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
详解Python的三种拷贝方式
2020/02/11 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
10条PHP编程习惯
2014/05/26 面试题
经典c++面试题四
2015/05/14 面试题
承诺书范文
2014/06/03 职场文书
故意杀人案辩护词
2015/05/21 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
JS数组去重详情
2021/11/07 Javascript