Table2Excel.js生成XLS,AJAX传PHP服务器时$_POST为空求助
嘿,我明白你遇到的问题了——用Table2Excel生成Blob后通过AJAX提交到PHP,结果$_POST返回空值对吧?这是因为直接发送二进制Blob数据时,PHP默认的表单解析逻辑识别不了它,咱们换个正确的姿势就能解决!
问题根源
当你直接把Blob作为POST请求的主体发送时,请求的Content-Type是Blob对应的MIME类型(这里是application/vnd.ms-excel),而PHP默认只会解析application/x-www-form-urlencoded或multipart/form-data格式的数据到$_POST数组里,所以自然拿不到值。
方案一:用FormData封装Blob(推荐)
这是最规范的文件上传方式,把Blob包装到FormData对象里,PHP就能通过$_FILES正确获取到文件:
// 你的原有Blob生成代码 var blob = new Blob([e.format(fullTemplate, e.ctx)], { type: "application/vnd.ms-excel" }); // 创建FormData并添加Blob文件 var formData = new FormData(); // 参数分别是:表单字段名、Blob对象、文件名 formData.append('exported_excel', blob, 'my_export.xls'); // 发送AJAX请求 const xhr = new XMLHttpRequest(); xhr.open('POST', 'your_save_script.php', true); xhr.onload = function() { if (xhr.status === 200) { console.log('文件已成功保存到服务器!'); console.log('服务器响应:', xhr.responseText); } else { console.error('上传失败:', xhr.responseText); } }; // 不需要手动设置Content-Type,XMLHttpRequest会自动处理为multipart/form-data xhr.send(formData);
对应的PHP处理代码:
<?php // 检查是否有有效文件上传 if (isset($_FILES['exported_excel']) && $_FILES['exported_excel']['error'] === UPLOAD_ERR_OK) { $temp_file = $_FILES['exported_excel']['tmp_name']; // 替换成你想要保存的服务器路径 $save_path = './saved_files/exported_excel.xls'; // 确保目标目录存在,如果不存在就创建 $save_dir = dirname($save_path); if (!is_dir($save_dir)) { mkdir($save_dir, 0755, true); } // 移动临时文件到目标位置 if (move_uploaded_file($temp_file, $save_path)) { echo "文件保存成功,路径:{$save_path}"; } else { echo "保存文件失败,请检查目标目录的写入权限。"; } } else { $error_msg = isset($_FILES['exported_excel']['error']) ? $_FILES['exported_excel']['error'] : '未接收到文件'; echo "上传出错:{$error_msg}"; } ?>
方案二:直接读取原始请求数据
如果你不想用FormData,也可以让PHP读取原始的请求输入流来获取Blob数据:
修改后的AJAX代码:
var blob = new Blob([e.format(fullTemplate, e.ctx)], { type: "application/vnd.ms-excel" }); const xhr = new XMLHttpRequest(); xhr.open('POST', 'your_save_script.php', true); // 设置正确的Content-Type xhr.setRequestHeader('Content-Type', 'application/vnd.ms-excel'); xhr.onload = function() { if (xhr.status === 200) { console.log('文件保存成功!'); } else { console.error('保存失败:', xhr.responseText); } }; xhr.send(blob);
对应的PHP代码:
<?php // 读取原始请求数据 $excel_content = file_get_contents('php://input'); $save_path = './saved_files/exported_excel.xls'; // 确保目录存在 $save_dir = dirname($save_path); if (!is_dir($save_dir)) { mkdir($save_dir, 0755, true); } // 写入文件 if (file_put_contents($save_path, $excel_content)) { echo "文件已成功保存到:{$save_path}"; } else { echo "写入文件失败,请检查目录权限。"; } ?>
两种方案都能解决$_POST为空的问题,推荐用第一种FormData的方式,因为它更符合HTTP文件上传的标准规范,也更容易处理错误情况。
内容的提问来源于stack exchange,提问作者Aditya Thakur
相关产品推荐
相关产品推荐

