使用 header() 函数设置响应头并配合 readfile() 读取文件内容即可实现最简单的 php 强制下载。核心做法是发送 content-type: application/octet-stream、content-disposition: attachment 以及 content-length,随后输出文件二进制流。若文件路径包含中文或特殊字符,需对文件名进行 url 编码处理,否则浏览器可能无法正确识别下载文件名。

header() 需要设置哪些关键参数
必须设置三个关键响应头:Content-Type 设为 application/octet-stream 以告知浏览器这是二进制数据;Content-Disposition 设为 attachment; filename="..." 触发下载行为;Content-Length 指定文件大小以便显示进度条。缺少任一头部都可能导致文件直接在浏览器中打开或下载失败。

<?php
$file = 'example.pdf';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
如何处理非 ASCII 字符的文件名
当文件名包含中文等非 ASCII 字符时,直接使用 basename() 会导致乱码。应使用 urlencode() 对文件名进行编码,并将其赋值给 filename*=UTF-8''... 字段,同时保留原始文件名作为后备。这样现代浏览器能正确解析 UTF-8 编码的中文文件名,旧版浏览器则回退到原始文件名。
立即学习“PHP免费学习笔记(深入)”;

<?php
$file = '测试文档.pdf';
$filename = urlencode($file);
header('Content-Disposition: attachment; filename="' . $file . '"; filename*=UTF-8\'\'.' . $filename);
readfile($file);
exit;
?>
如果文件不存在程序会返回什么结果
在提供的代码中,通过 file_exists() 检查文件存在性。如果文件不存在,程序不会执行任何 header() 或 readfile() 调用,因此不会向客户端发送任何下载相关的数据或错误信息。用户将看到一个空白页面,因为脚本在检查后直接结束,没有输出内容。



















