因为项目的需求,使用到PHP文件下载这个功能,通过查阅资料和实际操作完成了下载功能,现在我把研究成果分享给大家
1.根据下载文件的序号来查找,链接的形式如下:<a href="http://www.xxx.com/download.php?id=123456">点击下载文件</a>
<a href="http://www.xxx.com/download.php?id=123456">点击下载文件</a>
2.下载原理与实现
例如,需要下载的是一个文件名为xxx.rar的文件,首先创建文件是download.php的PHP文件。通过前面的例子很容易通过文件的ID号从数据库中得到待下载文件的真实位置,在获得文件的真实存储位置后,可以通过header()函数的location参数直接重定向到这个文件。但是这样仍然是不安全的,因为某些下载软件还是可以通过重定向分析获得该文件的位置信息。因此需要用另外一种方法,就是PHP的文件处理API函数。它是通过fread()函数把文件直接输出到浏览器提示用户下载,这样所有的处理都是在服务器端完成的,因此用户就无法获得文件具体存储位置信息的,示例代码如下:
public function download(){
if(IS_GET){
$id=I('id'); //获取ID
$res=M('data')->where(['id'=>$id])->find();
$url=DOWNLOAD.$res['data_path']; //拼接文件的相对路径
$name=str_replace(' ','-',$res['data_name']); //下载文件的名称(中间不能留空)
$size=filesize($url); //文件大小
if( !$res ){
header("Content-type: text/html; charset=utf-8");
echo "
<html>
<div>
<script>
alert('" . $name . "\\n文件不存在!');
window.history.go(-1); //返回上一页
</script>
</div>
</html>";
}else{
Header("content-type: application/octet-stream");
Header("content-disposition: attachment; filename=".$name);
Header("content-length: ".$size);
readfile($url);
}
}else{
return '文件不存在!';
}
}
上述代码中,程序发送Header信息是用来告诉Apache和浏览器下载文件的相关信息的。content-type的含义代表文件MIME类型是文件流格式。如果在Apache配置里面把文件的MIME类型设为application/octet-stream(如add application/octet-stream .xxx.rar),那么浏览器(客户端)就会知道,这是一个文件流格式的文件并提示用户下载。Accept-Ranges是一个响应头标,它允许服务器指明将在给定的偏移和长度处,为资源组成部分的接受请求,该头标的值被理解为请求范围的度量单位。Content-Length是指定包含于请求或响应中数据的字节长度,例如,Content-Length:382。Content-Disposition:attachment是用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$name该变量的值。
请大家多多支持!!!