php实现文件下载的几种方式

本文简单介绍在PHP中几种常用文件下载方式。
一、直接链接文件下载
在知道文件路径的情况下,可以简单的通过页面“a”标签元素,直接下载文件。 代码如下:
二、根据参数动态查找并跳转到下载链接
通常情况下,文件名是变动的,需要根据指定条件计算出文件名。此时可以在后台根据变量参数,动态计算查找到文件并跳转到下载链接。前端代码如下:
后台代码如下:
$down = $_GET['filename']; // 获取文件参数
$filename = $down . '.rar'; // 构造文件名称
$dir = "/"; // 相对于网站根目录的下载目录路径
$down_host = $_SERVER['HTTP_HOST']; // 当前域名
// 如果文件存在,则跳转到下载路径
if (file_exists(__DIR__ . '/' . $dir . $filename)) {
header('location:http://' . $down_host . $dir . $filename);
} else {
header('HTTP/1.1 404 Not Found');
}
文件存在时,点击“下载文件”即可正常下载文件。否则会提示404文件不存在,如下图
三、使用fread()函数把文件直接输出到浏览器
除了通过文件名下载,我们也可以在后台通过fread方法,读出文件内容,然后将文件内容以流的方式直接输出到浏览器。代码如下:
$file_name = "down.rar"; // 下载文件名
$file_dir = "./"; // 下载文件存放目录
// 检查文件是否存在
if (!file_exists($file_dir . $file_name)) {
header('HTTP/1.1 404 NOT FOUND');
} else {
// 以只读和二进制模式打开文件
$file = fopen($file_dir . $file_name, "rb");
// 告诉浏览器这是一个文件流格式的文件
Header("Content-type: application/octet-stream");
// 请求范围的度量单位
Header("Accept-Ranges: bytes");
// Content-Length是指定包含于请求或响应中数据的字节长度
Header("Accept-Length: " . filesize($file_dir . $file_name));
// 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header("Content-Disposition: attachment; filename=" . $file_name);
// 读取文件内容并直接输出到浏览器
echo fread($file, filesize($file_dir . $file_name));
fclose($file);
exit ();
}
总结:
第一个和第二个操作比较简单,但是容易暴露文件的真实地址,安全性不高。第三种能够较好的把文件的真实地址隐藏起来。