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

PHP无法读取PDF文件夹内容,学生成绩单下载功能报错求助

学生PDF成绩单下载问题排查与修复

核心问题分析

你的JS逻辑能正确生成文件名,但PHP返回"文件未找到",大概率是路径匹配错误、大小写不一致或权限问题导致的,以下是具体排查和修复方案:

排查与修复步骤

1. 修正文件路径(最常见原因)

PHP的相对路径是相对于download.php的位置,而非HTML/JS文件。比如:

  • 如果download.php在网站根目录,pdfs/文件夹也必须在根目录
  • 如果download.php在/api/子目录,路径要改成../pdfs/

更可靠的方式是使用绝对路径,避免相对路径的歧义:

// __DIR__ 代表当前PHP文件所在的绝对目录
$directory = __DIR__ . '/pdfs/';
$filePath = $directory . $fileName;

2. 检查文件名大小写

Linux/Unix服务器的文件名是区分大小写的,比如JS生成STU123.pdf,但实际文件是stu123.pdf就会匹配失败。

  • 确保预生成的PDF文件名和JS拼接的文件名完全一致(包括大小写)
  • 可以在PHP的else分支里输出$filePath,查看实际查找的路径:
    else {
        echo 'File not found. Target path: ' . $filePath;
    }
    

3. 处理路径遍历风险并验证文件可读性

为了安全(防止恶意用户通过../访问其他目录),同时确保文件可读取,修改PHP代码:

<?php
// 过滤文件名,只保留纯文件名,防止路径遍历
$fileName = basename($_GET['file']);

// 使用绝对路径定位PDF目录
$directory = __DIR__ . '/pdfs/';
$filePath = $directory . $fileName;

// 同时检查文件存在且可读
if (file_exists($filePath) && is_readable($filePath)) {
    header('Content-Type: application/pdf');
    // 修复引号转义问题,直接用双引号包裹即可
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    header('Content-Length: ' . filesize($filePath));
    readfile($filePath);
} else {
    echo 'File not found or unreadable. Target path: ' . $filePath;
}
?>

4. 检查文件权限

确保pdfs文件夹和里面的PDF文件对PHP进程(通常是www-data用户)有读取权限:

  • Linux系统执行命令:
    chmod 755 pdfs/  # 给文件夹设置可读可执行权限
    chmod 644 pdfs/*.pdf  # 给所有PDF文件设置可读权限
    

5. 验证编码一致性(针对含中文/特殊字符的文件名)

如果文件名包含中文或特殊字符,需确保:

  • JS生成的文件名编码是UTF-8
  • 服务器文件系统的编码也是UTF-8(Linux下可通过locale命令查看)

测试建议

  1. 手动拼接一个已知存在的PDF文件名,直接访问download.php?file=已知文件名.pdf,看是否能下载
  2. 查看服务器的错误日志(比如Apache的error.log),可能会有更详细的路径或权限报错信息

内容的提问来源于stack exchange,提问作者mud-cap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:29:51