多图片上传OCR识别生成Excel功能报错求助:上传时提示‘Uploaded data error’
问题排查与解决方法
首先,你遇到的「Uploaded data error」最直接的原因是upload.php里的循环变量$i未初始化就被使用,除此之外还有几处多文件上传适配的问题,我逐一给你拆解:
1. 核心错误:$i未定义导致的错误判断
在upload.php中,这段代码写在for循环外面:
if ($_FILES["uploadedFile"]['error'][$i] != 0) { echo "Uploaded data error"; die; }
但$i是循环内才会定义的变量,此时$i根本不存在,直接访问$_FILES["uploadedFile"]['error'][$i]会触发错误,直接输出「Uploaded data error」。
解决方法:把这段错误检查移到for循环内部,放在每个文件处理的开头:
for( $i=0 ; $i < $total ; $i++ ) { // 移到循环内,此时$i已定义 if ($_FILES["uploadedFile"]['error'][$i] != 0) { echo "Uploaded data error for file " . $_FILES["uploadedFile"]["name"][$i]; continue; // 跳过当前错误文件,继续处理其他文件 } // 后续的文件检查逻辑... }
2. 多文件上传的路径覆盖问题
原来的$target_file是在循环外定义的,所有文件都会被保存成同一个文件名,导致后面的文件直接覆盖前面的。而且imageFileType也是循环外获取,只能拿到第一个文件的扩展名。
解决方法:在循环内单独处理每个文件的路径和扩展名:
for( $i=0 ; $i < $total ; $i++ ) { // ...前面的错误检查... // 单独获取当前文件的扩展名 $currentFileName = $_FILES["uploadedFile"]["name"][$i]; $imageFileType = pathinfo($currentFileName, PATHINFO_EXTENSION); // 生成唯一的目标文件名,避免覆盖 $target_file = $target_dir . uniqid() . "." . $imageFileType; // 后续的文件大小、类型检查... }
3. 表单提交判断失效问题
upload.php里的if(isset($_POST["submit"]))判断会失效——你的前端表单通过onsubmit="event.preventDefault(); return myFunction();"阻止了默认提交,而且按钮逻辑没有传递submit字段,导致文件类型检查(getimagesize)完全不会执行。
解决方法:去掉这个判断,直接执行文件类型检查:
// 去掉if(isset($_POST["submit"]))包裹 $check = getimagesize($_FILES["uploadedFile"]["tmp_name"][$i]); if($check !== false) { // 文件是图片,正常处理 } else { echo "File " . $currentFileName . " is not an image."; $allowUpload = false; }
4. prepare.js的多文件适配问题
你的prepare.js原本只支持单文件,现在需要修改start函数来遍历所有上传的文件,收集所有识别结果后再统一处理:
async function start(filenames) { // 收集所有文件的识别结果 const allResults = []; for (const fileName of filenames) { const { data: { text } } = await readFile(fileName); const data = await parseDataFromTextAndPropertyNames(text, ['نقطة الخدمة', 'رقم العداد', 'القراءة']); allResults.push(data); } // 渲染所有结果到表格 constructTable('#table', allResults); let htmlstring = document.getElementById("table").innerHTML; // 提交到change.php生成Excel $.post('change.php', {htmlstring:htmlstring}).done(function(response){ alert(response); }); }
额外注意事项
- 确保
uploads/目录存在且有写入权限,否则move_uploaded_file会失败。 - 多文件上传时,建议在前端也做一次文件数量、大小、类型的校验,减少后端压力。
内容的提问来源于stack exchange,提问作者MrObscure
相关产品推荐
相关产品推荐

