PHP+Ajax图片上传异常:后端接收文件但status始终为0
图片上传后端状态始终为0的问题解决
我是PHP和JavaScript新手,刚注册StackOverflow,学习时遇到图片上传问题:想实现支持拖拽和点击的图片上传功能,用jQuery+Ajax发送FormData到PHP后端。目前前端能收到响应,但后端无法正确处理数据,status始终为初始值0,触发上传失败提示。控制台显示receivedImage能获取到上传文件名,FormData里也有文件信息,困惑为何后端已接收文件却无法进入成功分支。
前端JavaScript代码
function js_file_upload(file_obj){ if(file_obj != undefined){ var form_data = new FormData(); form_data.append('input_image', file_obj); $.ajax({ url: "../../PHP/login-signup/upload.php", type: 'POST', data: form_data, dataType: "json", cache:false, processData: false, contentType: false, enctype: 'multipart/form-data', success: function(response) { // 檢查 console.log(response.status); console.log(response.receivedImage); // 看formdate資訊 let object = {}; form_data.forEach((val, key) => { object[key] = val; }); console.log(object); if(response.status == 1){ let fileReader = new FileReader(); fileReader.onload = ()=>{ let fileURL = fileReader.result; let imgTag = `<img src="${fileURL}">`; dropArea.innerHTML = imgTag; } fileReader.readAsDataURL(file); // 此处变量应为file_obj,原代码未定义file alert("已上傳!"); }else{ console.log("上傳失敗!"); alert("上傳失敗!"); } }, error: function(jqXHR, textStatus, errorThrown) { console.log("上傳失敗:" + jqXHR, textStatus, errorThrown); alert("上傳失敗:" + errorThrown); } }); }
后端PHP代码
<?php require '../login-signup/config.php'; $response = array( 'status' => 0, 'receivedImage' => isset($_FILES['input_image']) ? $_FILES['input_image'] : null ); $errorSize = false; $errorType = false; if(isset($_POST['input_image']) && isset($_FILES['input_image'])){ // $_POST['input_image']不存在,导致条件不成立 $arr_file_types = ['image/png', 'image/jpg', 'image/jpeg']; $image = $_FILES['image']['name']; // 应为$_FILES['input_image']['name'] $image_size = $_FILES['image']['size']; // 同上,key错误 $image_tmp_name = $_FILES['image']['tmp_name']; // 同上 $image_folder = "../../image/uploaded_img/".$image; $ImgSizeMB = 10*pow(10,6); if($image_size > $ImgSizeMB){ $response["status"] = 0; $errorSize = true; }elseif(!in_array($_FILES['file']['type'], $arr_file_types)){ // key应为input_image,不是file $response["status"] = 0; $errorType = true; }else{ if($errorSize == false && $errorType == false) try { $insertQuery = "INSERT INTO users(image) VALUES (:image)"; $stmt = $pdo->prepare($insertQuery); $stmt->bindParam(':image', $image); move_uploaded_file($image_tmp_name, $image_folder); if ($stmt->execute()) { $response['status'] = 1; } } catch (PDOException $e) { echo "資料庫連線錯誤:" . $e->getMessage(); } } } echo json_encode($response); ?>
控制台截图

核心问题与修正方案
1. 后端判断条件错误
文件上传内容仅存在于$_FILES数组中,$_POST['input_image']不存在,原代码的判断条件永远不成立,直接跳过处理逻辑,导致status始终为0。
修正:
改为仅检查$_FILES并验证上传状态:
if(isset($_FILES['input_image']) && $_FILES['input_image']['error'] === UPLOAD_ERR_OK){ // 后续处理 }
2. $_FILES数组key全部写错
前端FormData的key是input_image,但后端错误使用image或file作为key,无法获取文件信息。
修正:
所有$_FILES['image']和$_FILES['file']替换为$_FILES['input_image']:
$image = $_FILES['input_image']['name']; $image_size = $_FILES['input_image']['size']; $image_tmp_name = $_FILES['input_image']['tmp_name']; // ... elseif(!in_array($_FILES['input_image']['type'], $arr_file_types)){
3. 前端变量错误
前端success回调中fileReader.readAsDataURL(file);的file未定义,改为函数参数file_obj:
fileReader.readAsDataURL(file_obj);
4. 可选优化:确保上传目录存在
若目标目录不存在,move_uploaded_file会失败,建议提前创建:
$image_folder = "../../image/uploaded_img/".$image; if(!is_dir(dirname($image_folder))){ mkdir(dirname($image_folder), 0755, true); }
修正后的完整后端代码
<?php require '../login-signup/config.php'; $response = array( 'status' => 0, 'receivedImage' => isset($_FILES['input_image']) ? $_FILES['input_image'] : null, 'error' => '' ); $errorSize = false; $errorType = false; // 修正判断条件:检查文件是否存在且无上传错误 if(isset($_FILES['input_image']) && $_FILES['input_image']['error'] === UPLOAD_ERR_OK){ $arr_file_types = ['image/png', 'image/jpg', 'image/jpeg']; $image = $_FILES['input_image']['name']; $image_size = $_FILES['input_image']['size']; $image_tmp_name = $_FILES['input_image']['tmp_name']; $image_type = $_FILES['input_image']['type']; $image_folder = "../../image/uploaded_img/".$image; $ImgSizeMB = 10 * 1024 * 1024; // 用10*1024*1024更直观表示10MB // 检查文件大小 if($image_size > $ImgSizeMB){ $response["status"] = 0; $response["error"] = "文件大小超过10MB"; $errorSize = true; // 检查文件类型 }elseif(!in_array($image_type, $arr_file_types)){ $response["status"] = 0; $response["error"] = "仅支持PNG/JPG/JPEG格式"; $errorType = true; }else{ if(!$errorSize && !$errorType){ // 确保上传目录存在 if(!is_dir(dirname($image_folder))){ mkdir(dirname($image_folder), 0755, true); } try { // 先移动文件再插入数据库,避免数据不一致 if(move_uploaded_file($image_tmp_name, $image_folder)){ $insertQuery = "INSERT INTO users(image) VALUES (:image)"; $stmt = $pdo->prepare($insertQuery); $stmt->bindParam(':image', $image); if ($stmt->execute()) { $response['status'] = 1; } else { $response['error'] = "数据库插入失败"; } } else { $response['error'] = "文件移动失败"; } } catch (PDOException $e) { $response['error'] = "数据库连接错误:" . $e->getMessage(); } } } } else { if(isset($_FILES['input_image'])){ // 捕获上传错误 switch($_FILES['input_image']['error']){ case UPLOAD_ERR_INI_SIZE: $response['error'] = "文件超过php.ini限制大小"; break; case UPLOAD_ERR_FORM_SIZE: $response['error'] = "文件超过表单限制大小"; break; case UPLOAD_ERR_PARTIAL: $response['error'] = "文件仅部分上传"; break; case UPLOAD_ERR_NO_FILE: $response['error'] = "未选择文件"; break; default: $response['error'] = "未知上传错误"; } } } echo json_encode($response); ?>
内容的提问来源于stack exchange,提问作者Xuan
相关产品推荐
相关产品推荐

