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

Framework7中AJAX文件上传报错求助:Illegal TypeError

解决Framework7中AJAX上传文件的"Illegal invocation"错误

我刚梳理了你的代码,这个错误的根源其实是FormData使用方式错误加上AJAX上传文件的关键配置缺失,咱们一步步来修正:

问题分析

  1. 错误嵌套FormData:你现在把post_data(FormData对象)作为普通JS对象的file属性传给AJAX的data参数,jQuery会尝试序列化这个嵌套的FormData,这就触发了"Illegal invocation"错误——FormData不能被普通序列化方法处理。
  2. 缺少上传必需的AJAX配置:上传文件时必须告诉jQuery不要处理数据、不要设置默认的Content-Type,否则浏览器无法正确识别文件上传的格式。

修改后的完整代码

function addVoiceMail() { 
    var status = '0'; 
    var formData = myApp.formToJSON('#my-form-sms'); 
    var post_data = new FormData(); 

    // 把表单的JSON数据逐个追加到FormData里
    for (var key in formData) {
        if (formData.hasOwnProperty(key)) {
            post_data.append(key, formData[key]);
        }
    }
    // 把状态值也加入FormData
    post_data.append('status', status);

    // 处理文件上传
    var fileInput = document.getElementById("msg_file"); 
    if (fileInput.files.length > 0) { 
        post_data.append('file', fileInput.files[0]); 
    } 

    $.ajax({ 
        url: baseurl2 + 'somepage.php', 
        type: "POST", 
        data: post_data, // 直接传递FormData对象,不要嵌套
        crossDomain: true, 
        cache: false, 
        // 这两个配置是文件上传的核心!
        processData: false, 
        contentType: false, 
        success: function (data) { 
            if (data == 'success') { 
                myApp.alert('sent', ''); 
                mainView.router.load({ url: 'success.html', ignoreCache: true, animatePages: true }); 
            } else { 
                var errors = JSON.parse(data); 
                $.each(errors, function (key, value) { 
                    myApp.addNotification({ title: 'Error', message: value }); 
                }); 
            } 
        },
        error: function(xhr, status, error) {
            // 新增错误回调方便调试
            console.log('AJAX Error:', error);
            myApp.alert('上传失败,请重试', '错误');
        }
    }); 
}

关键调整说明

  • 直接使用FormData作为data参数:把所有需要提交的数据(表单字段、状态、文件)都放到同一个FormData对象里,不要嵌套到普通JS对象中。
  • 添加processData: false:阻止jQuery自动序列化数据,因为FormData已经是符合上传要求的格式了。
  • 添加contentType: false:让浏览器自动生成包含boundary的multipart/form-data请求头,这是文件上传必需的。
  • 表单字段转存到FormData:原来的data2是JSON字符串,现在改成把每个表单字段单独追加到FormData,后端可以像接收普通表单字段一样获取这些值。

额外注意事项

  • 确保你的表单标签加上enctype="multipart/form-data"属性,虽然AJAX上传时这个不是强制的,但加上更规范:<form id="my-form-sms" enctype="multipart/form-data">
  • 后端somepage.php中要通过$_FILES['file']来接收上传的文件,表单字段可以通过$_POST获取(比如$_POST['你的表单字段名'])。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:53:37