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 默默经典版本
Aug 04 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
php实现四舍五入的方法小结
Mar 03 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
php代码检查代理ip的有效性
Aug 19 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
Ajax+PHP实现的分类列表框功能示例
Feb 11 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
Python中用Decorator来简化元编程的教程
2015/04/13 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
pandas值替换方法
2018/07/10 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
什么是组件架构
2016/05/15 面试题
企业内控岗位的职责
2014/02/07 职场文书
小学数学课题方案
2014/06/15 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
建筑结构施工求职信
2014/07/11 职场文书
英语系本科生求职信
2014/07/15 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
风之谷观后感
2015/06/11 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS