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免费学习笔记(深入)”;
filename*=UTF-8''xxx 格式filename=xxx(GBK 编码),但已基本淘汰,可只保 RFC 5987 方案rawurlencode() 处理文件名,保留原始编码逻辑替换原 Content-Disposition 行:
MediPro乡镇政府门户网站系统,适合乡镇政府机构创建地方门户网站,用以宣传本地资源,实现政务公开,促进乡镇基层信息化建设。本系统基于PHP+MYSQL开发,预设了乡镇风采、党政机构、政务公开、投资指南、服务导航、文件下载、公众互动、领导信箱等乡镇政府门户网站常用的栏目和测试数据,采用适合乡镇政府门户网站的专用模版,增强了系统的针对性和易用性。除了文章系统、图文系统、下载系统、社区交流、反馈表单
0
$filename = '报表_2024年10月.pdf';
$encoded = rawurlencode($filename);
header('Content-Disposition: attachment; filename="' . $filename . '"; filename*=UTF-8\'\'' . $encoded);
适合导出 CSV、XML、JSON 等轻量数据,无需先保存到磁盘。
Content-Type 为对应 MIME 类型(如 text/csv)fopen('php://output', 'w') 直接写入响应流ob_end_clean() 清除可能的缓冲区残留ob_get_level() > 0 && ob_end_clean())CSV 下载片段示例:
ob_end_clean();
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="export.csv"');
$output = fopen('php://output', 'w');
fputcsv($output, ['姓名', '邮箱', '注册时间'], ',', '"');
fputcsv($output, ['张三', 'zhang@example.com', '2024-10-01'], ',', '"');
fclose($output);
exit;
别让下载功能变成安全隐患或体验断点。
basename() 或白名单过滤,禁用 ../
['pdf', 'xlsx', 'csv'])做后缀检查,不单靠扩展名,必要时用 finfo_file() 验证真实类型while (!feof($fp)) { echo fread($fp, 8192); flush(); },配合 set_time_limit(0)
基本上就这些。header 设置对了,文件能读,名字不乱,权限可控,下载就稳了。
以上就是PHP文件下载实现方法指南_PHP header下载文件技巧的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号