您当前的位置: 首页 > 学无止境 > 网站建设 网站首页网站建设
php实现文件下载
发布时间:2015-09-24 08:03:55编辑:雪饮阅读()
下面是文件下载原理示意图:
在网站中若存在服务器无法直接解析的文件后缀那么该文件可以直接通过一个a链接便可使得用户直接下载,如nes游戏的rom文件后缀为.nes则直接可以下载的,但对于其他数据如图片等则需要处理。
当要下载的文件过大时是通过服务器端分批返回的,否则对于服务器端的瞬时压力会非常大的。下载文件需要头信息,浏览器根据这些特有的头信息来处理要下载的文件,若没有这些头信息则浏览器无法弹出下载文件的窗口。
根据其原理在源码中的具体实现:
<?php
header("Content-type:text/html;charset=utf-8;");
//演示一个文件下载
/*
参数说明:
$file_name 文件名
$file_sub_dir:下载文件的子路径“/xx/xx/”
*/
function down_file($file_name,$file_sub_dir){
//中文文件名需要转码
$file_name=iconv("utf-8","gb2312",$file_name);
$file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
//1、打开文件
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;//每次读取1024
/*
!feof()函数用来判断文件内容是否读取结束。这里文件若没有读取结束则使用while来不停的循环读取文件
*/
//为了下载安全要做一个字节计数器(或许没有必要)
$file_count=0;
while(!feof($fp) && ($file_size-$file_count>0)){
$file_data=fread($fp,$buffer);
//统计读取了多少字节
$file_count+=$buffer;
//把部分数据回送给浏览器(服务器不一定这样多次回送,若是文件较小就直接一次性回送回去)
echo $file_data;
}
//关闭文件
fclose($fp);
}
down_file("韩顺平2.gif","/down/");
?>
关键字词:php,文件下载,个人博客
上一篇:禁用缓存机制