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 中执行系统外部命令
Oct 09 PHP
别人整理的服务器变量:$_SERVER
Oct 20 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php+ajax无刷新上传图片实例代码
Nov 17 PHP
php时间计算相关问题小结
May 09 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
PHP延迟静态绑定的深入讲解
Apr 02 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
php中文件上传的安全问题
2006/10/09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python+os根据文件名自动生成文本
2019/03/21 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
新年爱情寄语
2014/04/08 职场文书
工作经历证明书范文
2014/11/02 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
张丽莉观后感
2015/06/16 职场文书
2019感恩宣传标语!
2019/07/05 职场文书