为啥 jQuery formData 需要 contentType=false?
Posted
技术标签:
【中文标题】为啥 jQuery formData 需要 contentType=false?【英文标题】:Why does jQuery formData need contentType=false?为什么 jQuery formData 需要 contentType=false? 【发布时间】:2020-06-13 20:33:10 【问题描述】:我的问题是关于使用 jQuery 发送表单数据。我读到当 contentType 行被省略时,jQuery 默认为 x-www-formdata-urlencoded 编码。这是我认为应该使用的。但是如果 contentType 设置为 false,它使用 multipart/form-data 编码。
然而,当 contentType 被省略时,php 会说 'searchcity' 索引未定义,这意味着 jQuery 没有成功地从我的 html 输入中发送 'searchcity'。当 contentType 设置为 false 时,表示 jQuery 使用 multipart/form-data,PHP 能够找到索引,一切正常。
但在 HTML 中,如果省略 'enctype',则默认为 x-www-formdata-urlencoding。如果我使用<form action = 'search.php' method = "POST"></form>
,它使用 x-www-formdata-urlencoding 并且工作正常。我不需要使用<form action = 'search.php' method = "POST" enctype = "multipart/form-data"></form>
那么为什么发送表单时,HTML使用x-www-formdata-urlencoding可以成功发送表单数据给PHP,而jQuery需要multipart/form-data呢?
我只发送文本,不发送文件。
<html>
<header><script src = "/jquery.js"></script></header>
<a href="/login.html">Login/Register</a> <br>
<form id = "searchform">
<input type = "text" name = "searchcity" size = "40"><br>
<input type = "button" id = "submit" value = "Search">
</form>
<script>
$("#submit").click(function()
if( $("#searchform")[0].reportValidity() )
var form = new FormData( $("#searchform")[0] );
$.post(
url:"/search.php",
processData:false, //prevents jquery from turning form to string
contentType:false, // this means to use multipart form encoding, but why?
data:form,
success:function(data)
alert(data);
);
);
</script>
</html>
https://pastebin.com/rMh3dr7r
【问题讨论】:
When contentType is set to false, that means jQuery uses multipart/form-data
。不正确,请阅读文档:As of jQuery 1.6 you can pass false to tell jQuery to not set any content type header.
api.jquery.com/jquery.ajax(在 contentType 下)
我明白了,但如果是这样,为什么 HTML 仍然可以通过 x-www-formdata-urlencoding 发送表单,但 jQuery 需要 contentType:false?默认情况下,如果 contentType 被省略,jQuery 通过 x-www-formdata-urlencoding 发送。
【参考方案1】:
contentType 选项为 false 用于传递文件的 multipart/form-data 表单。当将 contentType 选项设置为 false 时,它会强制 jQuery 不添加 Content-Type 标头,否则将缺少边界字符串。
【讨论】:
我明白了,但如果是这样,为什么 HTML 仍然可以通过 x-www-formdata-urlencoding 发送表单,但 jQuery 需要 contentType:false?默认情况下,如果 contentType 被省略,jQuery 通过 x-www-formdata-urlencoding 发送。以上是关于为啥 jQuery formData 需要 contentType=false?的主要内容,如果未能解决你的问题,请参考以下文章
通过 JQuery AJAX 一起发送 FormData 和 String 数据?