0x01 借助html完成
和直接用html
完成没有太大区别。
<?php
/**
* Created by PhpStorm.
* User: TuTuB
* Date: 3/17/2020
* Time: 15:53
*/
header("Content-type:text/html;charset=utf-8");
echo "<a href=\"download.php?file=test.zip\">点击下载</a>";
if(@$_GET["file"]){
$file = $_GET["file"];
header("Location:http://localhost/XXX_PHP_Study/".$file);
}
?>
效果如下:
0x02 使用head()和fread()配合完成
这种方法要复杂一些。
<?php
/**
* Created by PhpStorm.
* User: TuTuB
* Date: 3/17/2020
* Time: 15:53
*/
header("Content-type:text/html;charset=utf-8");
echo "<a href=\"download.php?file=test.zip\">点击下载</a>";
if(@$_GET["file"]){
$file = $_GET["file"];
$downfile = fopen($file,"rb"); //以二进制形式打开文件
ob_clean(); //如果要下载图片,一定等需要此函数先清空缓存!
header("Content-type:application/octet-stream"); //文件类型为数据流
header("Accept-Ranges:bytes"); //单位是字节
header("Accept-Length:".filesize($file)); //长度大小
header("Content-Disposition:attachment;filename=$file"); //下载时有提示框
//fread() 函数读取打开的文件。函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。
$file_con=fread($downfile,filesize($file));
echo $file_con;
fclose($downfile);
}
?>
效果如下:
0x03 总结
看起来效果是一样的,实际上后面这种会好用的多。
php
这种,可以下载txt
或者图片
类型的文件,而html
那种则是直接显示txt
类型或者图片
的文件。php
这种通过组合下载的文件名和目录名,可以达到隐藏真实文件路径的作用,而html
这种容易暴露出真实的文件路径。
图片下载后无法正常显示