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&amp;java(三)
Oct 09 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
6个超实用的PHP代码片段
Aug 10 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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生成验证码
2017/02/23 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
JS简单计算器实例
2015/01/20 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
python字符类型的一些方法小结
2016/05/16 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
浅析Python数据处理
2018/05/02 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
Python实现FLV视频拼接功能
2020/01/21 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
安全生产专项整治方案
2014/05/06 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
大班上学期个人总结
2015/02/13 职场文书
二审答辩状范文
2015/05/22 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
校友会致辞
2015/07/30 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
理解python中装饰器的作用
2021/07/21 Python