Php中文件下载功能实现超详细流程分析


Posted in PHP onJune 13, 2012

客户端从服务端下载文件的流程分析:

浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下。
服务器接受到该请求以后,马上运行该down.php文件
运行该文件的时候,必然要把将要被下载的文件读入内存当中(这里是圣诞狂欢.jpg这张图片),这里通过fopen()函数完成该动作
注意:任何有关从服务器下载的文件操作,必然需要先在服务端将文件读入内存当中

现在文件已经在内存当中了,这是需要从内存当中读取文件,通过fread()函数完成该动作
需要注意的是,如果文件较大,文件应该是被分成多段返回给客户端的,并不是等文件在服务端全部读取完毕后,一次性返回给客户端,因为这样子会增加服务器的负荷。
所以我们需要在php代码中设置一次读取的字节数,比如我在下面的代码中通过$buffer=1024设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)

流程图:
Php中文件下载功能实现超详细流程分析

<?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中变量及部分适用方法
Mar 27 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
php使用base64加密解密图片示例分享
Jan 20 PHP
php获取参数的几种方法总结
Feb 18 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
php异常处理技术,顶级异常处理器
Jun 13 #PHP
PHP的异常处理类Exception的使用及说明
Jun 13 #PHP
PHP抽象类 介绍
Jun 13 #PHP
MySQL 日期时间函数常用总结
Jun 12 #PHP
PHP简洁函数(PHP简单明了函数语法)
Jun 10 #PHP
php数字游戏 计算24算法
Jun 10 #PHP
细谈php中SQL注入攻击与XSS攻击
Jun 10 #PHP
You might like
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
js查错流程归纳
2012/05/04 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
python分数表示方式和写法
2019/06/26 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
城管综合整治方案
2014/05/01 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2014年材料员工作总结
2014/11/19 职场文书
公司聚餐通知
2015/04/22 职场文书
文明礼貌主题班会
2015/08/14 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
Java线程的6种状态与生命周期
2022/05/11 Java/Android
zabbix配置nginx监控的实现
2022/05/25 Servers
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers