Php 可以使用enctype=”吗;“多部分/表单数据”;在没有文件输入的窗体上

Php 可以使用enctype=”吗;“多部分/表单数据”;在没有文件输入的窗体上,php,html,Php,Html,在我的服务器(运行PHP5.4)上,我有一种从数据库连接对象传递表单的通用方法。有些对象将有一个文件输入,有些则没有。我更愿意总是设置enctype=“multipart/form data”,而不是刮取表单(或数据库对象),查看它是否包含,并有条件地执行 我使用类似的表单对其进行了测试,收到的数据与我将enctype留空时完全相同(来自$\u POST参数) 所以,我的测试表明没问题,但是有什么理由我应该为不包含文件的表单提交关闭enctype=“multipart/form data”?从逻

在我的服务器(运行PHP5.4)上,我有一种从数据库连接对象传递表单的通用方法。有些对象将有一个文件输入,有些则没有。我更愿意总是设置
enctype=“multipart/form data”
,而不是刮取表单(或数据库对象),查看它是否包含
,并有条件地执行

我使用类似
的表单对其进行了测试,收到的数据与我将enctype留空时完全相同(来自
$\u POST
参数)


所以,我的测试表明没问题,但是有什么理由我应该为不包含文件的表单提交关闭
enctype=“multipart/form data”

从逻辑上讲,切换的主要原因是在处理文件时(因为文件不能通过
应用程序/x-www-form-urlencoded
进行编码)。除此之外,两者都没有对另一个的限制(这只是它的编码方式)

最显著的区别是开销(由于
multipart/formdata
包含名称/值信息以外的详细信息,因此以更多数据为基础)

例如,给定以下形式:

<form method="POST><!-- exempting encoding/action -->
  <input type="text" name="greeting" value="Hello">
  <input type="text" name="name" value="Brad">
  <input type="submit" value="Submit">
</form>
其中as
多部分/表单数据可能如下所示:

-----------------------------1234567890
Content-Disposition: form-data; name="greeting"

Hello
-----------------------------1234567890
Content-Disposition: form-data; name="name"

Brad
-----------------------------1234567890
如您所见,使用
多部分/表单数据
enctype会带来大量额外的开销,这通常就是为什么只在必要时才包括它的原因。

简短回答:是的

回答:是的,但是你会稍微增加POST有效负载的大小(从而增加提交表单所需的时间)

让我们看看POST请求实际发送到浏览器的内容。我使用
nc(1)
监听一个端口,然后使用Firefox从一个简单的HTML页面发出一个请求,该页面有两个表单字段:
foo
,其值是
a
,和
bar
,其值是
b

如果不指定
enctype
,浏览器将默认为
application/x-www-form-urlencoded
。这是发送的内容:

POST/HTTP/1.1
主机:localhost:9000
用户代理:Mozilla/5.0(X11;Linux x86_64;rv:38.0)Gecko/20100101 Firefox/38.0 Iceweasel/38.1.0
接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8
接受语言:en-CA,en-US;q=0.7,en;q=0.3
接受编码:gzip,deflate
DNT:1
推荐人:http://localhost/form.html
Cookie:style=null;org.cups.sid=26d9134b774e3f9237c14f9f3fbe9082
连接:保持活力
内容类型:application/x-www-form-urlencoded
内容长度:11
foo=a&bar=b
字段作为URL编码的键/值对发送,就像在
GET
请求中一样。唯一的区别是你可以发送更多的数据。非常简单

另一方面,
multipart/form数据
提交则相当庞大:

POST/HTTP/1.1
主机:localhost:9000
用户代理:Mozilla/5.0(X11;Linux x86_64;rv:38.0)Gecko/20100101 Firefox/38.0 Iceweasel/38.1.0
接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8
接受语言:en-CA,en-US;q=0.7,en;q=0.3
接受编码:gzip,deflate
DNT:1
推荐人:http://localhost/form.html
Cookie:style=null;org.cups.sid=26d9134b774e3f9237c14f9f3fbe9082
连接:保持活力
内容类型:多部分/表单数据;边界=------------------------------------1894318417527599887278201061
内容长度:277
-----------------------------1894318417527599887278201061
内容配置:表单数据;name=“foo”
A.
-----------------------------1894318417527599887278201061
内容配置:表单数据;name=“bar”
B
-----------------------------1894318417527599887278201061--

URL编码对于大量二进制数据来说效率不高。您必须发送三个字节,而不是发送一个字节(
%xx
)。通过使用易于区分的边界值分隔每个字段(在本例中,
------------------------------------1894318417527599887278201061,但浏览器将为每个请求生成一个新的边界值),浏览器可以发送原始二进制数据。明显的缺点是,对于小请求,它会带来一些严重的开销。在这个简单的示例中,多部分请求比URL编码的请求大25倍。然后,在这两种情况下,提交请求正文所需的时间将与打开连接所需的时间相比相形见绌。但这是另一天的故事。

没什么问题,但它会产生更大的帖子正文,浪费一点带宽。这不重要。对
enctype
唯一重要的是表单必须是
method=“post”
类型。轶事:我一直在表单上使用它,只是为了输入。我对它了解的还不够,所以你没有理由不谈它。也许是Marc B所说的带宽,但实际上这只是其中的几个bytes@ScriptKitty请看我的答案。这是一个尽可能简单的表单,我看到的不仅仅是“几个字节”。(这也免除了
内容类型
标题)。@Brad Christie谢谢你,伙计,我学到了一些东西
-----------------------------1234567890
Content-Disposition: form-data; name="greeting"

Hello
-----------------------------1234567890
Content-Disposition: form-data; name="name"

Brad
-----------------------------1234567890