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添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
百度实时推送api接口应用示例
Oct 21 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
Laravel 类和接口注入相关的代码
Oct 15 PHP
php经典趣味算法实例代码
Jan 21 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 PHP
tp5.1 框架查询表达式用法详解
May 25 PHP
浅析PHP echo 和 print 语句
Jun 30 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
Symfony核心类概述
2016/03/17 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
原生js实现日期联动
2015/01/12 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
JavaScript中各数制转换全面总结
2017/08/21 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
详解Vue This$Store总结
2018/12/17 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python使用装饰器进行django开发实例代码
2018/02/06 Python
简单了解Django ContentType内置组件
2019/07/23 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
毕业研究生的自我鉴定
2013/11/30 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
Python数据类型最全知识总结
2021/05/31 Python
React Fragment介绍与使用详解
2021/11/11 Javascript