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

使用PHP下载文件时保存为空文件的问题求助

问题修复方案

首要问题:变量名不匹配

你代码里犯了一个低级错误——变量名前后不一致:
你把GET参数存到了$filename里,但后面的正则校验、文件路径拼接全用了未定义的$file变量。这直接导致正则校验失败,根本没执行到文件读取的逻辑,所以下载的文件是空的。

修正后的完整代码

<?php
if(isset($_GET['file']))
{
    $filename = $_GET["file"];
    // 把所有$file替换为$filename
    if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $filename)){
        $filepath = "images/" . $filename;
        if(file_exists($filepath)) {
            // 清除输出缓冲区,避免header前有隐藏输出
            ob_clean();
            flush();
            header("Content-Type: application/octet-stream");
            header("Content-Transfer-Encoding: Binary");
            header("Content-disposition: attachment; filename=\"".$filename."\""); 
            readfile($filepath);
            // 终止脚本,防止后续输出破坏文件内容
            exit;
        }
    }
}
?>

额外需要排查的点

  • 路径正确性:确认images/目录和download.php的相对位置正确。如果download.php在网站根目录,images也必须在根目录;不确定的话用绝对路径更稳妥:$filepath = $_SERVER['DOCUMENT_ROOT'] . '/images/' . $filename;
  • 文件权限:确保PHP进程能读取目标图片文件,文件权限建议设为644,目录权限设为755。
  • 正则限制:你的正则规则会过滤掉开头是.的文件,且要求文件名结尾必须是字母。如果需要支持更多文件名格式,得调整正则表达式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:35:28