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

使用PHP自动下载ZIP文件,现有代码下载的文件损坏无法使用求助

下载脚本问题排查及修复方案

核心问题点

  • Content-Disposition头语法错误
    现有代码的引号拼接逻辑完全错误,且filename参数不需要携带服务器内部路径,仅需填写用户下载时所见的文件名即可,错误的头信息会导致浏览器解析文件异常,同时还会泄露服务器目录结构,不符合隐藏原始链接的需求。
  • 缓冲区残留输出问题
    仅调用ob_end_flush()无法彻底清除之前的缓冲区内容,如果脚本前存在空格、UTF-8 BOM头、调试输出内容,这些内容会和文件内容一并返回,直接导致压缩包损坏。
  • 错误被抑制无法定位问题
    给readfile加了@错误抑制符,当文件不存在、权限不足、路径错误时,无法看到报错信息,返回的错误文本或者空内容都会被当成文件内容,最终得到损坏文件。
  • 路径校验缺失
    没有提前校验目标文件是否存在、是否可读,filesize获取到错误的大小值时,也会导致浏览器接收内容长度不匹配,文件损坏。

修正后的完整代码

<?php
// 先关闭所有输出缓冲区,清空残留内容
while (ob_get_level()) {
    ob_end_clean();
}

$filename = "dsk.zip";
$filePath = "./zz/" . $filename;

// 提前校验文件合法性
if (!file_exists($filePath) || !is_readable($filePath)) {
    http_response_code(404);
    exit("文件不存在或无访问权限");
}

// 发送下载头信息
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
// filename仅填用户看到的文件名,不要带服务器路径
header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filePath));

// 输出文件内容
readfile($filePath);
// 终止后续输出,避免多余内容
exit;
?>

额外注意事项

  • 确保PHP脚本开头<?php前没有任何空格、换行、UTF-8 BOM头,脚本末尾不要加?>闭合标签,避免尾部空格被输出。
  • 确认zz目录及目录下的dsk.zip文件,给web运行用户(如www-data、apache、nginx)开放读权限。

内容的提问来源于stack exchange,提问作者Trop Viff2.0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:21:02