method="post" enctype="text/plain" 不兼容?

Posted

技术标签:

【中文标题】method="post" enctype="text/plain" 不兼容?【英文标题】:method="post" enctype="text/plain" are not compatible? 【发布时间】:2011-11-29 12:07:58 【问题描述】:

当我使用时

<form method="post" enctype="text/plain" action="proc.php"> 

表单数据无法正确发送到 proc.php 文件。为什么?问题是什么?为什么我不能在 post 中使用 text/plain encoding 但我可以在 get 方法中使用它?

【问题讨论】:

我很确定你不需要定义enctype,除非你正在做文件上传,那么它应该是:enctype="multipart/form-data" link 根据 w3schools (link),application/x-www-form-urlencoded 是默认值。 @Narek 我假设浏览器不知道如何处理它,因为它不是有效的令牌。我敢打赌浏览器将 enctype="text/plain" 视为与 enctype="cheeseburger" 相同,它什么也不做...... 实际上,使用method="post" enctype="text/plain",浏览器发送数据,PHP 将其存储在$HTTP_RAW_POST_DATA,但它不会填充$_POST。不管怎样,你为什么坚持要text/plain 我不知道为什么这个问题被关闭了。这是一个很好的问题,已经有了很好的答案。 【参考方案1】:

html5 确实定义了如何格式化提交为text/plain 的表单数据:https://w3c.github.io/html/sec-forms.html#plain-text-form-data。

在该部分的底部,它说:

使用 text/plain 格式的有效负载旨在为人类提供 可读。它们不能被计算机可靠地解释,因为 格式不明确(例如,无法区分 值末尾的换行符中的文字换行符)。

因此,PHP 不尝试解释它并仅以原始形式提供它并不是不合理的。对我来说,这似乎是正确的方法。

【讨论】:

链接断开 - 你可能想要html.spec.whatwg.org/multipage/… @TomAnderson - 谢谢。更新了最新 W3C 草案标准的链接,但是您提供的 WHATWG 是等效的。【参考方案2】:

[修订]

答案是,因为 PHP 不处理它(而且它不是错误):

https://bugs.php.net/bug.php?id=33741

Valid values for enctype in <form> tag are:

application/x-www-form-urlencoded
multipart/form-data

第一个是默认的,第二个是上传文件时才需要的。

@Alohci 解释了为什么 PHP 不填充 $_POST 数组,而是将值存储在变量 $HTTP_RAW_POST_DATA 中。

text/plain enctype 可能出错的示例:

file1.php:

<form method="post" enctype="text/plain" action="file2.php">
<textarea name="input1">abc
input2=def</textarea>
<input name="input2" value="ghi" />
<input type="submit">
</form>

file2.php:

<?php
print($HTTP_RAW_POST_DATA);
?>

结果:

input1=abc
input2=def
input2=ghi

无法区分input1input2 变量的值是什么。可以是

input1=abc\r\ninput2=def, input2=ghi, 以及 输入1=abc,输入2=def\r\ninput2=ghi

使用前面提到的其他两种编码时没有这样的问题。

GET 和 POST 的区别:

在 GET 中,变量是 URL 的一部分,并且作为查询字符串出现在 URL 中,因此它们必须进行 URL 编码(即使您写 enctype="text/plain",它们也是如此 - 它只是被浏览器忽略;您可以使用 Wireshark 嗅探请求数据包进行测试), 发送 POST 时,变量不是 URL 的一部分,而是作为 HTTP 请求(POSTDATA)中的最后一个 header 发送的,您可以选择是发送为text/plain 还是application/x-www-form-urlencoded,但是第二个是唯一明确的解决方案。

【讨论】:

根据HTML5 text/plain 是enctype 的第三个有效内容类型。格式在dev.w3.org/html5/spec/… 中描述。 一张不错的桌子是here(我已经发布了) 坦率地说,我从不相信 w3schools 所说的话。 好吧,这个看起来更可信pseudo-flaw.net/content/web-browsers/form-data-encoding-roundup ;) $HTTP_RAW_POST_DATA 在 PHP 5.6 中已弃用,并在 PHP 7.0 中删除。

以上是关于method="post" enctype="text/plain" 不兼容?的主要内容,如果未能解决你的问题,请参考以下文章

method="post" enctype="text/plain" 不兼容?

<form action="result.jsp" method="post">中的后面的action、method中的引号填啥?

form method="post" 阻止了我的 Meta 刷新

405 Method not Allow, methods=["POST", "GET"] 不工作

我正在尝试从 post 方法获取令牌,但我得到 json 响应 "Get/Method?Not Allowed" 我为此使用 POST 方法

表单中method="post"啥意思?