在此之前先看一个小例子:
<?php var_dump($_FILES);?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Page Title</title> </head> <body> <form action="" method="POST"> <input type="file" name="file"> <input type="submit" value="submit"> </form> </body> </html>
$_FILES 会获取到值么?
如果不是很清楚或者觉得可以获取到,那么可以接着看看。
本文部分图片和段落节选,原文为:理解HTTP之Content-Type
感谢。
Content-Type 是什么?
通俗理解的的话,它就是我们规定发送数据包的一种格式,就像我们寄快递一样。不同的包装公司 (Content-Type) 有不同的包装方式。
接受方也会根据这个值来进行下一步操作。
这也就是说明了我们上面的那个小例子中。$_FILES 变量中为什么获取不到值。
表单发送(未指定 Content-Type 使用默认),$_FILES 不认识默认的 Content-Type ,拒收,所以才会产生获取不到的情况
Content-Type 作用?
Content-Type用于指定内容类型,一般是指网页中存在的Content-Type,Content-Type属性指定请求和响应的HTTP内容类型。如果未指定 ContentType,默认为text/html。
在nginx中有个配置文件mime.types
,主要是标示Content-Type的文件格式。
下面是几个常见的Content-Type:
1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
...
前面几个都很好理解,都是html,css,javascript的文件类型,后面四个是POST的发包方式。
下面讲讲他们具体的格式问题
Content-Type 的格式?
1:application/x-www-form-urlencoded
application/x-www-form-urlencoded
是常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式,
2:multipart/form-data
multipart/form-data
用在发送文件的POST包。
这里Content-Type
告诉我们,发包是以multipart/form-data
格式来传输,另外,还有boundary
用于分割数据。
当文件太长,HTTP无法在一个包之内发送完毕,就需要分割数据,分割成一个一个chunk发送给服务端,
3:application/json
通过json形式将数据发送给服务器,一开始,我尝试通过curl,给服务器发送application/json
格式包,
4:text/xml
通过xml 形式将数据发送给服务器
总结:
发现了么。
php中$_POST
只能读取application/x-www-form-urlencoded
数据,$_FILES
只能读取multipart/form-data
类型数据.
具体为什么,就因该想一下这这两种发送的不同。
对于其他格式的传输,应该怎么取呢?
那么,要读取text/xml格式的数据,可以用: $file = fopen(‘php://input’, ‘rb’); $data = fread($file, length); fclose($file); 或者 $data = file_get_contents(‘php://input’);
对于其他格式传输,取得,其实都是一种文件流一样的。
之后按照规则去转码。
原文地址:https://www.cnblogs.com/25-lH/p/9152024.html