PHP文件下载实现方法指南_PHP header下载文件技巧

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

PHP文件下载实现方法指南_PHP header下载文件技巧-第1张图片-佛山资讯网

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 邮箱

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~