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 相关文章推荐
第十节 抽象方法和抽象类 [10]
Oct 09 PHP
PHP多个版本的分析解释
Jul 21 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php使用PDO方法详解
Dec 27 PHP
php文件夹的创建与删除方法
Jan 24 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP中JSON的应用技巧
Oct 10 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
Jan 04 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查看一个变量的占用内存的实例代码
2020/03/29 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
JS 判断代码全收集
2009/04/28 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
机器学习实战之knn算法pandas
2019/06/22 Python
python3实现弹弹球小游戏
2019/11/25 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
2013年大学生的自我鉴定
2013/10/24 职场文书
大学生工作推荐信范文
2013/12/02 职场文书
二手书店创业计划书
2014/01/16 职场文书
《春天来了》教学反思
2014/04/07 职场文书
大学生毕业求职信
2014/06/12 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
酒会开场白大全
2015/06/01 职场文书
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL
apache ftpserver搭建ftp服务器
2022/05/20 Servers