Framework7中AJAX文件上传报错求助:Illegal TypeError
解决Framework7中AJAX上传文件的"Illegal invocation"错误
我刚梳理了你的代码,这个错误的根源其实是FormData使用方式错误加上AJAX上传文件的关键配置缺失,咱们一步步来修正:
问题分析
- 错误嵌套FormData:你现在把
post_data(FormData对象)作为普通JS对象的file属性传给AJAX的data参数,jQuery会尝试序列化这个嵌套的FormData,这就触发了"Illegal invocation"错误——FormData不能被普通序列化方法处理。 - 缺少上传必需的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
相关产品推荐
相关产品推荐

