You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP用readfile强制下载时浏览器不显示文件总大小如何解决?

解决PHP强制下载文件时浏览器不显示总大小的排查方案

问题背景

使用以下PHP代码强制浏览器下载文件时,Chrome和Firefox均无法显示文件总大小,但下载功能正常:

//send file
$fileName = basename($fullPath);
$length = filesize($fullPath);

header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header('Content-length: ' .  $length);
header("Content-disposition: attachment; filename=$fileName");

readfile($fullPath);

exit;

已尝试在.htaccess中添加SetEnv no-gzip dont-vary及相关SetEnvIfNoCase规则,但未解决问题。服务器环境为Apache,PHP版本8.3。

排查方案

  • 确认文件大小计算准确性
    在filesize()调用前清除文件状态缓存,避免因文件更新导致缓存的大小值不准确:

    clearstatcache(true, $fullPath);
    $length = filesize($fullPath);
    
  • 直接禁用PHP输出压缩
    除了.htaccess设置,在PHP代码中直接禁用输出压缩,确保Content-Length头不被篡改:

    ini_set('zlib.output_compression', 'Off');
    

    同时检查php.ini中zlib.output_compression配置是否为Off,避免全局压缩影响。

  • 验证HTTP响应头完整性
    用浏览器开发者工具(Network面板)查看响应头:

    • 确认Content-Length头存在且数值正确,未被mod_deflate等模块修改
    • 若存在Transfer-Encoding: chunked头,会覆盖Content-Length,导致浏览器无法获取总大小,可添加代码禁止分块编码:
      header('Transfer-Encoding: none');
      
  • 检查文件路径与权限
    确保目标文件真实存在且PHP进程可读取,可添加前置检查:

    if (!file_exists($fullPath) || !is_readable($fullPath)) {
        http_response_code(404);
        exit('文件不存在或无法读取');
    }
    
  • 替换readfile为手动输出方式
    部分环境下readfile可能触发输出缓冲或压缩,尝试用文件流输出:

    ob_end_clean(); // 清空并关闭输出缓冲
    $fp = fopen($fullPath, 'rb');
    fpassthru($fp);
    fclose($fp);
    
  • 针对下载路径禁用Apache压缩
    若服务器加载了mod_deflate或mod_gzip模块,可在.htaccess中针对下载路由明确禁用压缩:

    <FilesMatch "\.(php)$">
        SetEnv no-gzip 1
    </FilesMatch>
    

内容的提问来源于stack exchange,提问作者faeqeh fassihi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:37:11