在很多网站开发中,用户可能需要下载文件。使用 PHP 提供的 header 函数,可以方便地设置 HTTP 响应头,控制文件的下载行为。在这个教程中,我们将介绍如何使用 PHP 的 header 函数设置 Content-Disposition 来指定下载文件的文件名。
Content-Disposition 是一个 HTTP 头,它告知浏览器如何处理文件。最常见的用法是在浏览器中启动文件下载,并为下载的文件指定一个文件名。它通常与 Content-Type 一起使用,后者告诉浏览器如何解释文件的内容类型。
header 函数可以用来发送原始 HTTP 头。如果我们想指定文件下载时的文件名,我们可以设置 Content-Disposition 头。下面是一个简单的例子:
<?php
// 设置文件路径
$file = 'path/to/your/file.txt';
// 确保文件存在
if (file_exists($file)) {
// 设置正确的内容类型,告诉浏览器这是一个下载文件
header('Content-Type: application/octet-stream');
// 设置 Content-Disposition 头,指定文件下载时的文件名
header('Content-Disposition: attachment; filename="downloaded_file.txt"');
// 设置文件大小
header('Content-Length: ' . filesize($file));
// 读取并输出文件内容
readfile($file);
exit;
} else {
echo "文件不存在!";
}
?>
header('Content-Type: application/octet-stream');:这行代码告诉浏览器下载的是二进制文件,不进行自动打开。
header('Content-Disposition: attachment; filename="downloaded_file.txt"');:这行代码指定了文件的下载方式为 attachment(即下载),并且给文件指定了下载后的名称 "downloaded_file.txt"。
header('Content-Length: ' . filesize($file));:这行代码指定了文件的大小,有助于浏览器正确处理文件的下载。
readfile($file);:此函数会读取文件并将内容发送到浏览器,从而开始文件下载。
有时候,我们可能希望文件名是动态生成的,而不仅仅是一个固定的字符串。在这种情况下,可以通过 PHP 变量来设置文件名。例如:
<?php
// 设置文件路径
$file = 'path/to/your/file.txt';
// 动态生成文件名
$fileName = 'downloaded_' . date('Y-m-d_H-i-s') . '.txt';
// 确保文件存在
if (file_exists($file)) {
// 设置正确的内容类型
header('Content-Type: application/octet-stream');
// 动态设置 Content-Disposition 头
header('Content-Disposition: attachment; filename="' . $fileName . '"');
// 设置文件大小
header('Content-Length: ' . filesize($file));
// 读取并输出文件内容
readfile($file);
exit;
} else {
echo "文件不存在!";
}
?>
在这个例子中,文件名将包含当前的日期和时间(如:downloaded_2025-05-04_12-30-45.txt),每次下载时文件名都会不同。
有时候,我们需要通过 URL 提供文件下载,而不仅仅是服务器上的本地文件。这时,我们也可以用 header 函数来设置 Content-Disposition,并将文件内容从远程服务器下载过来。
<?php
// 设置远程文件 URL
$url = 'https://m66.net/files/sample.txt';
// 获取文件内容
$fileContent = file_get_contents($url);
// 如果文件内容获取成功
if ($fileContent !== false) {
// 设置文件类型
header('Content-Type: application/octet-stream');
// 设置文件下载名称
header('Content-Disposition: attachment; filename="sample_from_m66.txt"');
// 设置文件大小
header('Content-Length: ' . strlen($fileContent));
// 输出文件内容
echo $fileContent;
exit;
} else {
echo "无法下载文件!";
}
?>
在这个例子中,我们从 https://m66.net/files/sample.txt 下载文件,并通过 header 设置下载文件的名称为 sample_from_m66.txt。
在发送任何 header 之前,确保没有任何 HTML 输出。因为 HTTP 头必须在任何内容输出之前发送。
如果文件很大,考虑使用流式读取文件内容,而不是将整个文件加载到内存中。
通过 PHP 的 header 函数,我们可以很容易地控制文件的下载行为,包括设置文件下载时的文件名。在实际开发中,这种功能非常常见,尤其是在文件管理系统、报表生成等应用中。