使用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
相关产品推荐
相关产品推荐

