method =“post”enctype =“text / plain”不兼容?

时间:2011-10-02 18:11:04

标签: php html forms post

当我使用

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

表单数据无法正确发送到proc.php文件。为什么?问题是什么?为什么我不能在帖子中使用text / plain编码,但我可以将它与get方法一起使用?

2 个答案:

答案 0 :(得分:23)

<强> [修订]

答案是,因为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,以及
  • input1 = abc,input2 = def\r\ninput2=ghi

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

GET和POST之间的区别:

  • 在GET中,变量是URL的一部分,并作为查询字符串存在于URL中,因此必须进行URL编码(即使您编写enctype="text/plain",它们也是如此 - 它只是被浏览器忽略;您可以使用Wireshark测试它来嗅探请求数据包),
  • 发送POST时,变量不是URL的一部分,而是作为HTTP请求(POSTDATA)中的最后一个头发送,您可以选择是将它们作为text/plain还是{{1}发送},但第二个是唯一的非模糊解决方案。

答案 1 :(得分:12)

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

在该部分的底部,它说:

  

使用text / plain格式的有效负载是人为的   可读。它们不能被计算机可靠地解释,因为   格式含糊不清(例如,没有办法区分a   文本换行值来自换行符中的换行值。

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