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

PHP文件下载导致PDF/Excel/Word/PPT文件损坏问题求助

问题分析与解决方案

你的问题核心是下载的二进制文件(Office文档、PDF)出现字节缺失,导致文件损坏。以下是针对性的排查和修复方案:

1. 强制二进制传输模式

二进制文件在传输时必须以二进制模式处理,避免系统自动转换换行符或编码。在现有header中添加:

header('Content-Transfer-Encoding: binary');

同时,确保在输出文件前清理所有可能的缓冲内容,防止额外字符混入:

ob_clean(); // 清空输出缓冲区
flush();    // 刷新缓冲区
readfile($filePath);
exit; // 执行后立即终止脚本,避免后续输出

2. 修正Content-Type映射错误

你的$app_type数组存在类型错误,错误的MIME类型可能导致浏览器解析文件异常:

$app_type = [
    'pdf' => 'application/pdf',
    'doc' => 'application/msword',
    'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'xls' => 'application/vnd.ms-excel',
    'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'ppt' => 'application/vnd.ms-powerpoint',
    'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
];

3. 确保文件路径与大小计算准确

  • 使用realpath($filePath)验证文件路径是否指向正确的物理文件,避免相对路径或符号链接导致的文件读取异常:
$realFilePath = realpath($filePath);
if (!$realFilePath || !is_file($realFilePath)) {
    die("文件不存在");
}
header("Content-Length: " . filesize($realFilePath));
readfile($realFilePath);
  • 检查filesize()是否获取到正确的文件大小,部分场景下(如文件刚被修改)可能需要清除文件状态缓存:
clearstatcache(true, $filePath);

4. 排查脚本额外输出

  • 检查PHP脚本的开头和结尾,确保<?php之前没有空格、换行或UTF-8 BOM头(BOM会输出3个隐藏字节)。
  • 若脚本不需要输出HTML内容,直接删除末尾的?>标签,避免标签后出现的空格被输出。

5. 替代readfile的文件读取方式

如果readfile仍存在截断问题,尝试用fopen/fread的方式手动输出文件:

$handle = fopen($filePath, 'rb'); // 二进制只读模式
if ($handle) {
    while (!feof($handle)) {
        echo fread($handle, 8192); // 每次读取8KB
        flush();
    }
    fclose($handle);
}
exit;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:15:01