带文件上传的表单无法提交至目标div的问题排查求助
问题原因及解决方案
你的代码失效的核心原因是:$.post结合serialize()的方式无法处理文件上传控件的二进制数据——serialize()只能序列化文本类型的表单字段,会直接忽略文件控件的内容;同时普通的POST请求也不支持传输二进制文件。
要解决这个问题,需要改用FormData对象来包装表单数据,并通过$.ajax配置正确的请求参数,具体修改如下:
修改后的代码
HTML部分(添加文件上传控件)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <div id="the form"> <form action="destination_file.html" id="testform"> <INPUT Type="hidden" NAME="func" VALUE="1004"> <TEXTAREA NAME="NOTES" ROWS=4 COLS=34></TEXTAREA> <!-- 新增的文件上传控件 --> <INPUT TYPE="FILE" NAME="PIC_UPLOAD"> <input type="submit" value="Submit"> </form> </div> <hr> <div id="targetdiv"> results to go here </div>
JavaScript部分
$("#testform").submit(function(event) { // 阻止表单默认提交行为 event.preventDefault(); var $form = $(this), url = $form.attr('action'); // 创建FormData对象,自动包含所有表单字段(包括文件) var formData = new FormData(this); // 使用$.ajax发送请求,配置必要参数 $.ajax({ url: url, type: 'POST', data: formData, processData: false, // 禁止jQuery将FormData转换为字符串(破坏文件数据) contentType: false, // 让浏览器自动生成multipart/form-data请求头(包含正确的boundary) success: function(data) { $('#targetdiv').empty().append(data); } }); });
关键注意点
FormData会自动收集表单中所有字段,包括文件的二进制数据,无需手动拼接- 必须设置
processData: false和contentType: false,否则jQuery会错误处理文件数据,导致上传失败 - 服务器端需要适配
multipart/form-data类型的请求,比如PHP中用$_FILES['PIC_UPLOAD']获取上传的文件,其他后端语言也有对应的文件接收API
内容的提问来源于stack exchange,提问作者rdel
相关产品推荐
相关产品推荐

