php强制下载文件时,header 顺序必须严格遵循:先发送 http 状态码(如 200 ok),再设置内容类型 content-type,接着设置内容长度 content-length,最后输出 content-disposition 并关闭输出缓冲。若顺序颠倒或混入其他 header,浏览器可能无法正确识别下载行为或导致文件损坏。

header() 调用顺序对下载的影响是什么
在 PHP 中,header() 函数的调用顺序直接决定了浏览器解析响应头的逻辑。如果 Content-Disposition 放在 Content-Type 之前,部分浏览器可能忽略下载提示而尝试内联预览;如果 Content-Length 缺失,浏览器可能无法显示进度条或提前断开连接。正确的顺序确保浏览器先知道“这是什么”,再知道“有多大”,最后知道“怎么存”。

<?php
$file = 'example.pdf';
if (file_exists($file)) {
header('HTTP/1.1 200 OK');
header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
exit;
}如何处理文件名包含中文或特殊字符的情况
当文件名包含非 ASCII 字符时,直接使用 basename() 可能导致编码错误。应使用 urlencode() 对文件名进行编码,并在 Content-Disposition 中使用 filename*=UTF-8''... 格式,以兼容现代浏览器。同时,需确保 Content-Type 和 Content-Length 仍按标准顺序发送,避免因编码问题导致 Header 解析失败。
立即学习“PHP免费学习笔记(深入)”;

<?php
$file = '示例文件.pdf';
$filename = urlencode(basename($file));
header('HTTP/1.1 200 OK');
header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="' . $filename . '"; filename*=UTF-8\'\'.' . rawurlencode($file));
readfile($file);
exit;如何验证下载文件是否完整
通过对比本地文件大小与服务器返回的 Content-Length,可验证文件完整性。若两者不一致,说明传输中断或 Header 设置错误。建议在代码中添加日志记录,打印实际文件大小与预期值,便于排查问题。



















