文件下载是 Web 应用中常见的需求之一。通过 PHP 的 header() 函数,可以实现将文件推送到浏览器,触发用户的文件下载操作。本文将详细介绍如何通过 PHP 的 header() 函数实现文件下载功能,同时讲解前端如何触发请求以及后端如何使用 header() 函数推送文件到浏览器。
在前端,我们可以使用 HTML 或 JavaScript 来触发文件下载请求。最简单的方式就是通过点击一个链接来触发下载。通常,我们会使用 a 标签来定义一个链接,并利用 href 指定文件的 URL。
<a href="http://m66.net/download.php?file=example.txt" download>点击下载文件</a>
在这个例子中,用户点击链接后,浏览器会请求 download.php 文件,并通过 GET 请求将文件参数(如 file=example.txt)传递给后端 PHP 脚本。
另外,你也可以通过 JavaScript 动态触发文件下载,比如:
function downloadFile() {
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://m66.net/download.php?file=example.txt", true);
xhr.responseType = "blob"; // 表示返回的数据是二进制文件
xhr.onload = function() {
const blob = xhr.response;
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'example.txt'; // 设置下载的文件名
link.click(); // 触发点击,下载文件
};
xhr.send();
}
这段 JavaScript 会通过 Ajax 请求文件,并使用 Blob 对象创建文件下载链接,随后自动触发下载。
在 PHP 中,header() 函数用于发送原始 HTTP 头信息。通过 header() 函数,我们可以告知浏览器下载某个文件。具体操作如下:
首先,确保你已经验证了文件的存在。
设置适当的 Content-Type 和 Content-Disposition 头部,以告诉浏览器如何处理文件。
使用 readfile() 或其他方法将文件内容输出给浏览器。
<?php
// download.php
// 获取文件名参数
$file = isset($_GET['file']) ? $_GET['file'] : '';
$filePath = '/path/to/files/' . $file; // 设置文件的绝对路径
// 检查文件是否存在
if (file_exists($filePath)) {
// 设置响应头,告知浏览器下载文件
header('Content-Type: application/octet-stream'); // 适用于所有文件类型
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"'); // 强制下载并指定文件名
header('Content-Length: ' . filesize($filePath)); // 文件大小
header('Cache-Control: no-cache, no-store, must-revalidate'); // 禁用缓存
header('Pragma: no-cache');
header('Expires: 0');
// 输出文件内容
readfile($filePath);
exit;
} else {
echo '文件不存在或路径错误!';
}
?>
在这个 PHP 示例中,我们首先获取 URL 中传递的文件参数(例如 example.txt),然后通过文件路径查找文件。如果文件存在,我们通过 header() 设置文件的下载类型和其他信息,接着使用 readfile() 输出文件内容,最终实现文件的下载。
header('Content-Type: application/octet-stream'):设置文件类型为二进制流。对于所有类型的文件,使用 application/octet-stream 作为通用 MIME 类型。
header('Content-Disposition: attachment; filename="filename"'):设置浏览器在收到该响应时将文件作为附件下载,并给文件指定一个文件名。文件名可以通过 basename() 获取文件的基本名称。
header('Content-Length: ' . filesize($filePath)):设置文件的大小。这对于大文件尤其重要,浏览器可以基于此信息估算下载进度。
readfile($filePath):该函数会读取文件并直接输出到浏览器。
exit;:在输出文件内容后,调用 exit; 终止脚本执行,避免多余的输出或响应。
通过使用 PHP 的 header() 函数,结合合适的 HTTP 头设置,可以实现文件下载功能。在前端,用户通过点击链接或触发 Ajax 请求来请求文件;在后端,PHP 通过 header() 函数设置正确的响应头,之后将文件内容推送到浏览器进行下载。通过这种方式,你可以方便地为 Web 应用添加文件下载功能。