You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:47:34