为啥 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 数据?

为啥 FormData 是空的? [复制]

使用jquery-form的FormData上传文件带参数

为啥 Object.fromEntries(formData) 工作

为啥 formData 不适用于多个文件?

jquery 怎么获取formdata数据