如何使用 AJAX 检查本地文件夹是否为空并返回布尔结果

本文详解如何通过 ajax 调用 php 脚本判断指定目录是否为空,并在前端正确接收和处理布尔逻辑响应,解决因 php 输出缺失、类型不匹配导致的 `result` 始终为空的问题。

在 Web 开发中,常需通过前端触发后端逻辑来检查服务器上某个目录的状态(例如导出文件夹 D:/output 是否已生成 Excel 文件)。但需特别注意:浏览器无法直接访问本地文件系统路径(如 D:/output),该路径必须是 Web 服务器可访问的服务端路径(如 /var/www/html/output 或 C:\xampp\htdocs\output),且 PHP 进程需具备对应读取权限。

✅ 正确的前后端协作流程

1. 前端 AJAX 请求(优化版)

function downloadExcel() {
    const folder = "output"; // ✅ 改为相对服务端路径(如位于项目根目录下的 output/)

    if (result.isConfirmed) {
        $.ajax({
            type: 'POST',
            url: 'check_file.php',
            data: { folder: folder },
            cache: false,
            dataType: 'text', // 明确期望纯文本响应(避免 JSON 解析干扰)
            success: function(response) {
                // 将响应转为数字后判断:'1' → true,'0' → false
                const isEmpty = parseInt(response.trim()) === 0;
                if (isEmpty) {
                    Swal.fire('执行成功', '目标文件夹为空,可开始导出', 'success');
                } else {
                    Swal.fire('执行失败', '文件夹非空,请先清理或检查', 'error');
                }
            },
            error: function(xhr, status, error) {
                console.error("AJAX 请求失败:", status, error);
                Swal.fire('请求异常', '无法连接到服务器,请检查网络或后端配置', 'error');
            }
        });
        refresh();
    } else if (result.dismiss === Swal.DismissReason.cancel) {
        // 取消逻辑...
    }
}

2. 后端 PHP 脚本(check_file.php — 安全强化版)

⚠️ 关键注意事项

  • 路径安全性:绝不可直接拼接用户传入的 $_POST['folder'] 到 scandir(),必须通过 realpath() + 白名单校验 + 基础路径限制,防止目录遍历攻击(如 ../etc/passwd)。
  • 输出一致性:PHP 必须仅输出一个整数 0 或 1,无任何额外字符(包括空格、换行、HTML 标签),否则 parseInt() 会失败。
  • 跨域与协议:若前端运行在 file:// 协议下(本地双击 HTML),AJAX 将因浏览器同源策略被阻止——务必通过本地服务器(如 XAMPP、VS Code Live Server)访问。
  • 权限问题:确保 Web 服务器用户(如 www-data 或 apache)对目标目录有 read 权限。

✅ 最佳实践总结

环节 推荐做法
前端判断 使用 parseInt(response) === 0 替代字符串比较,语义清晰且容错性强
PHP 输出 echo 0 / echo 1,禁用 return、echo "true" 等非数值输出
路径处理 始终基于 __DIR__ 构建绝对路径,禁用用户直输完整路径(如 D:/output)
错误处理 PHP 层返回 400/403 HTTP 状态码,前端 error 回调统一捕获

遵循以上方案,即可稳定、安全地实现“前端触发 → 后端检查目录 → 返回布尔状态”的闭环逻辑。