本文详解如何通过 ajax 调用 php 脚本判断服务器端指定目录是否为空,并在前端正确接收和处理布尔型响应,重点解决因输出缺失、类型混淆导致的 `result` 始终为空的问题。
在 Web 开发中,常需通过前端触发后端逻辑(如检查某导出目录是否存在文件),再根据结果执行不同操作(如弹窗提示、刷新页面等)。但实际开发中,一个典型陷阱是:PHP 脚本未正确输出可被 JavaScript 解析的值,导致 AJAX 的 success 回调中 result 为空字符串或无法转换的文本。
以你的代码为例,问题根源在于:
1. 优化后的 check_file.php(推荐):
false, 'message' => 'Folder path not provided']);
exit;
}
$dir = $_POST['folder'];
// 安全校验:仅允许合法路径(生产环境务必加强!)
if (!is_dir($dir) || !is_readable($dir)) {
echo json_encode(['success' => false, 'message' => 'Invalid or unreadable directory']);
exit;
}
function is_dir_empty($dir) {
return (count(scandir($dir)) === 2); // . 和 .. 两个条目
}
$result = is_dir_empty($dir) ? 0 : 1; // 0 = empty, 1 = not empty
echo json_encode(['isEmpty' => (bool)$result === false]); // 或直接 echo $result;
?>? 说明:使用 json_encode() 返回结构化 JSON,既清晰又健壮;'isEmpty' => false 表示“非空”,语义更直观。
2. 前端 AJAX 调用(适配 JSON 响应):
function downloadExcel() {
const folder = "D:/output"; // ⚠️ 注意:此路径为服务器路径,非用户本地路径!
if (result.isConfirmed) {
$.ajax({
type: 'POST',
url: 'check_file.php',
data: { folder: folder },
dataType: 'json', // 显式声明期望 JSON 响应
cache: false,
success: function(response) {
if (response.success === false) {
Swal.fire('Error', response.message, 'error');
return;
}
// 核心逻辑:根据 isEmpty 字段判断
if (response.isEmpty === true) {
Swal.fire('Success', 'The folder is empty — ready for new export.', 'success');
} else {
Swal.fire('Warning', 'Files exist in the folder. Extraction skipped.', 'warning');
}
},
error: function(xhr, status, error) {
console.error("AJAX Error:", status, error);
Swal.fire('Request Failed', 'Server communication error.', 'error');
}
});
refresh();
} else if (result.dismiss === Swal.DismissReason.cancel) {
// handle cancel...
}
}要让 AJAX 正确接收 PHP 的布尔逻辑结果,核心原则是:PHP 输出可预测、可解析的机器值(推荐 JSON),JS 按约定字段消费。避免混合自然语言输出与布尔判断,杜绝 return 替代 echo,并始终对输入做防御性校验。如此,downloadExcel() 才能稳定、安全、可维护地完成目录状态检查任务。