PHP输入流和表单提交类型浅析

来源:互联网 发布:淘宝设置满多少包邮 编辑:程序博客网 时间:2024/05/17 17:46


解读PHP的输入流

1,php://input 是一个只读的文件流,允许用户从http请求中读取原始数据。

     在使用POST请求时,最好使用php://input来代替。为什么? 一个简单的$HTTP_RAW_POST_DATA不是可以读取了么?

     因为 php://input 不依赖于php.ini 配置。(是啊,php.ini 那么多配置项,每次都看着让人头痛,累觉不爱是吗?)


2,默认情况下PHP只支持Content-Type为application/x-www.form-urlencoded 类型的数据。

     使用 php://input 和  HTTP_RAW_POST_DATA 都可以处理Content-Type=text/xml 类型的数据。可以这样用

   <?php $postdata = file_get_contents("php://input"); ?> 
     但 php://input不能处理enctype="multipart/form-data"类型的请求。


3,_POST数据可以看做是将HTTP_RAW_POST_DATA分离成若干键值对后的数据

     $HTTP_RAW_POST_DATA 应该是这个样   key1=value1&key2=value2
         
那么$_POST这个数组则应该是这个样子:

    

$_POST = array(    "key1" => "value1",    "key2" => "value2",);。

注意:

一个用php://input打开的流只能读一次,由于SAPI的实现问题,这个流对象不支持seek操作。

这样,你只能打开另一个php://input并重新读取,当然,前提是请求数据已经保存下来。

通常,这事POST请求时的情况,其它如PUT或者PROPFIND的请求方式则不能这样操作。


4,    提交表单时,enctype 指的是form里的content-type。(也是http报文中的header)

       application/x-www-form-urlencoded 是浏览器默认的content-type.

       此外还有multipart/form-data。

       如果还有其它内容类型,那么这种未定义的数据如何处理是未定义的。浏览器将会直接忽略这些封装类型并且不会报错。

       比如,有一种内容类型是 application/octet-stream,那么浏览器就会把它当作一块结构未知的数据块发出去。

       至于服务器怎么去处理这些数据。我们下次来好好探讨下。



0 0
原创粉丝点击