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

如何从表单获取图片并通过Ajax提交至Laravel?报错Illegal invocation

解决jQuery Ajax提交文件时的「Uncaught TypeError: Illegal invocation」错误

错误原因

你把FormData对象嵌套在了普通的data对象里,jQuery默认会尝试序列化这个data对象,但FormData是专门用于文件上传的特殊容器,无法被常规方式序列化,所以触发了非法调用错误。

正确解决方案

直接用FormData存储所有表单数据(包括文本字段和文件),同时在Ajax请求中必须设置两个关键参数:processData: false(阻止jQuery自动序列化数据)和contentType: false(让浏览器自动生成正确的文件上传请求头)。

修改后的代码示例

JavaScript/jQuery部分:

$('form').on('click', 'button.btn', function() {
    // 初始化FormData容器
    var formData = new FormData();
    
    // 添加文本字段数据
    formData.append('first_name', $("#first_name").val());
    formData.append('email', $("#email").val());
    formData.append('password', $("#password").val());
    formData.append('re_password', $("#re_password").val());
    formData.append('access_token', getCookie("access_token"));
    
    // 添加文件数据
    jQuery.each($('#image')[0].files, function(i, file) {
        formData.append('image', file);
    });
    
    // 发起Ajax请求
    response = ajaxRequest("http://localhost:8000/api/admins/create", "POST", formData);
});

确保你的ajaxRequest函数包含以下配置:

function ajaxRequest(url, method, data) {
    return $.ajax({
        url: url,
        type: method,
        data: data,
        processData: false, // 必须设置:禁止jQuery处理FormData
        contentType: false, // 必须设置:让浏览器自动生成multipart/form-data头
        // 可添加success、error等回调逻辑
    });
}

简化技巧

如果表单字段较多,可直接通过表单元素快速生成FormData,无需逐个append:

// 直接从表单生成包含所有字段的FormData
var formData = new FormData($('#form')[0]);
// 再手动添加不在表单内的字段(比如access_token)
formData.append('access_token', getCookie("access_token"));

内容的提问来源于stack exchange,提问作者user15040527

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:40:50