PHP文件下载核心是正确设置HTTP响应头以强制浏览器下载而非显示,需检查文件权限、用readfile流式输出、处理中文文件名编码、动态生成时写入php://output,并注意路径遍历防护、类型校验与访问控制。

PHP 实现文件下载,核心在于正确设置 HTTP 响应头(header),让浏览器识别为“要下载”而非“直接显示”。关键不是读取文件本身,而是告诉浏览器:这是附件、有名字、别缓存、长度明确。
基础下载:强制触发保存对话框
最常用场景——用户点击链接或按钮,下载服务器上的某个文件(如 report.pdf、data.xlsx)。
- 先检查文件是否存在且可读:
if (!is_file($file) || !is_readable($file)) { die('文件不存在或无权限'); } - 用
readfile()流式输出,避免内存溢出(尤其大文件) - 必须在输出任何内容前调用
header(),且不能有空格、BOM 或 echo/print 干扰
示例代码:
$file = '/path/to/document.pdf';
if (is_file($file) && is_readable($file)) {
$filename = basename($file);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . filesize($file));
header('Cache-Control: no-cache, must-revalidate, max-age=0');
header('Pragma: public');
readfile($file);
exit;
}
登录后复制
中文文件名兼容:解决乱码问题
直接用中文名在 filename=xxx 中会导致 Chrome/Firefox 显示乱码或截断。需按 RFC 5987 编码(推荐 UTF-8 + urlencode)。
立即学习“PHP免费学习笔记(深入)”;
- Chrome、Edge、Firefox 支持
filename*=UTF-8''xxx格式 - 旧版 IE 只认
filename=xxx(GBK 编码),但已基本淘汰,可只保 RFC 5987 方案 - 用
rawurlencode()处理文件名,保留原始编码逻辑
替换原 Content-Disposition 行:
标签: php js json 编码 浏览器 app edge csv pdf stream 邮箱
还木有评论哦,快来抢沙发吧~