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和ACCESS写聊天室(九)
Oct 09 PHP
php缓存技术介绍
Nov 25 PHP
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
用php如何解决大文件分片上传问题
Jul 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查看session内容的函数
2008/08/27 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
python实现简单的计时器功能函数
2015/03/14 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python几种常用功能实现代码实例
2019/12/25 Python
Django如何使用redis作为缓存
2020/05/21 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
服装厂厂长职责
2013/12/16 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
销售求职信范文
2014/05/26 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
市级三好生竞选稿
2015/11/21 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技