.form文件_PHP 用户请求数据获取与文件上传

我们上篇教程提到,要获取 HTTP 请求数据,可以通过 $_GET$_POST$_REQUEST 等 PHP 内置的超全局变量,如果要获取 Cookie 和文件上传信息,可以通过额外的 $_COOKIE$_FILES。今天,学院君就来给大家演示下如何使用这些超全局变量获取请求数据。

1、GET 请求参数

我们知道,HTTP GET 请求是没有请求实体(表单请求数据)的,所有对于 GET 请求来说,请求数据以 URL 查询字符串(Query String)的形式提供的,所谓查询字符串,就是 URL 中 ? 之后的请求参数,例如对下面这个 URL 请求来说:

//xueyuanjun.com/search?term=laravel

term=laravel 就是查询字符串,也就是 GET 请求参数。

我们在 http/index.php 中通过 var_dump($_GET) 打印 GET 请求数据:

<?php echo '
'
;//var_dump($_SERVER);
var_dump($_GET);  

http 目录下通过 php -S localhost:9000 启动 HTTP 服务器,然后在浏览器中访问 http://localhost:9000

a5f752f45c58f7107dc3875668c9a47e.png

当没有任何请求数据时,打印结果为空,如果请求 URL 中包含了查询字符串:

f92c6709e2017938c7ba444917c4e3a9.png

则对应的 $_GET 变量值是一个以参数名为键,参数值为值的关联数组。非常简单。显然,要获取某个具体参数值,通过键名获取即可:

'name'];

要注意的是,$_SERVER$_GET$_POST 之类的超全局变量只能在 Web 模式下生效,如果通过命令行访问,因为不是 HTTP 请求,所以会报错:

b229e811ccadcdf1ba0f2a8d5065d5b7.png

2、POST 表单请求

看完 GET 请求,我们接着来看 POST 请求,对于 Web 页面而言,POST 请求通常就是表单请求,我们在 http 目录下新建一个 form.html 来编写这个 HTML 表单,并引入 Bootstrap CSS 框架来优化样式:

html>

我们在 form 标签中设置 method 属性值为 postaction 属性值为 index.php,即表示点击登录按钮后,表单数据会以 POST 方式提交到 index.php 这个脚本进行处理。

在浏览器中访问 http://localhost:9000/form.html,就可以看到登录表单了:

c2367eaa1235d4b9a6491fbbb5aa99ba.png

修改 index.php 代码如下:

<?php echo '
'
;//var_dump($_SERVER);//var_dump($_GET);
var_dump($_POST);
$name = $_POST['name'];
$password = $_POST['password'];
printf("用户名: %s, 密码: %s\n", $name, $password);

现在,我们改为通过 $_POST 获取请求数据,使用方式和 $_GET 一样,只不过它接收的是 POST 请求数据。我们切换到登录表单页面,输入数据,点击「登录」提交表单,页面就会跳转到 index.php,并打印出提交数据:

b1147426c2b62278f7f82a0b3c3f3200.png
a7ea2bd8e59c58b8d903ac3438e87ffc.png

3、通过 $_REQUEST 获取请求数据

$_POST 超全局变量是无法获取 GET 请求数据的,同理,$_GET 超全局变量也无法获取 POST 请求数据,比如我们尝试在表单提交 action 对应 URL 中添加查询字符串:

<form method="post" action="index.php?website=https://xueyuanjun.com">

刷新表单页面,重写填写数据提交表单,可以看到打印 $_POST 结果中不包含 website 信息:

e3acadc186512db7d94b608d52a3b2dd.png

要同时获取 GET 和 POST 请求数据,可以通过 $_REQUEST 超全局变量,我们将 index.php 中的代码调整如下:

var_dump($_REQUEST);
$name = $_REQUEST['name'];
$password = $_REQUEST['password'];
$website = $_REQUEST['website'];
printf("用户名: %s, 密码: %s, 网站: %s\n", $name, $password, $website);

使用方式所有超全局变量都是一样的,只是现在通过 $_REQUEST 既可以获取 POST 请求数据,又可以获取 GET 请求数据,在表单提交页面重新提交表单,打印结果如下:

3c99165d0aef6c76b24ea0ebcb6cfb97.png

4、文件上传

表单数据除了可以包含普通的文本信息和密码信息外,还可以包含文件信息,不过对于通过表单上传的文件,不能通过之前的 $_GET$_POST$_REQUEST 超全局变量获取,只能通过专门的 $_FILES 超全局变量获取。

文件上传表单

下面我们来简单演示下如何在 PHP 中通过表单上传文件,首先在 http 子目录下新建 file.html 来编写对应的 HTML 表单:

html>

需要注意的是文件上传只能通过 POST 请求完成,并且需要额外设置表单属性 enctype 值为 multipart/form-data(默认是 application/x-www-form-urlencoded)。

$_FILES 数据结构

我们在 http 目录下新建一个 PHP 脚本 file.php 来定义服务端逻辑:

<?php echo '
'
;
var_dump($_FILES);

首先打印 $_FILES 查看其数据结构,我们在文件上传表单中选择一个本地图片上传,上传成功后,服务端打印结果如下:

299853981973a73a11910e7a22b2a064.png

可以看到 $_FILES 是一个键值对关联数组,键名是文件上传组件设置的 name 属性,对应的值也是一个关联数组,其中包含了详细的文件信息,包含文件名、MIME 类型、文件默认上传位置(位于临时目录下)、错误信息以及文件尺寸,我们可以结合这些新息将上传文件保存到指定位置。在 PHP 中,可以通过内置函数 move_uploaded_file 将上传文件从临时目录移动到指定目录。

文件上传处理

下面我们在 file.php 中编写对应的文件上传处理代码:

<?php //echo '
';
//var_dump($_FILES);// 获取上传文件
$image = $_FILES['image'];// 处理文件上传过程中的错误if ($image['error'] != UPLOAD_ERR_OK) {switch ($image['error']) {case UPLOAD_ERR_INI_SIZE:case UPLOAD_ERR_FORM_SIZE:
            trigger_error('上传文件过大', E_USER_ERROR);break;case UPLOAD_ERR_PARTIAL:
            trigger_error('上传文件不完整', E_USER_ERROR);break;case UPLOAD_ERR_NO_FILE:
            trigger_error('没有文件被上传', E_USER_ERROR);break;case UPLOAD_ERR_NO_TMP_DIR:
            trigger_error('未指定或找不到临时目录', E_USER_ERROR);break;case UPLOAD_ERR_CANT_WRITE:
            trigger_error('上传目录无法写入', E_USER_ERROR);break;default:
            trigger_error('其他文件上传错误', E_USER_ERROR);break;
    }
}// 限定上传文件类型if (!in_array($image['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
    trigger_error('只支持 jpg/jpeg、png、gif 格式图片上传', E_USER_WARNING);
}// 限定上传文件大小if ($image['size'] > 1 * 1024 * 1024) {
    trigger_error('上传文件不能超过 1M', E_USER_WARNING);
}// 设置文件上传路径为 Web 根目录下的 images 子目录
$uploaddir =  __DIR__ . '/images/';
$filepath = $uploaddir . $image['name'];// 移动上传文件到指定位置if (move_uploaded_file($image['tmp_name'], $filepath)) {// 上传成功,则在页面预览上传的图片echo '文件上传成功';
    $webpath = '/images/' . $image['name'];echo ' . $webpath . '">';
} else {echo '文件上传失败,请重试!';
}
测试文件上传

最后,我们访问文件上传页面,选择一张本地图片上传,选择之后,点击「上传」按钮开始上传,上传成功后,会在 file.php 页面显示出上传的图片,表明上传成功:

fbe128461e931c2c48424c22d47b4e74.png
211fefe6495e7656f8281fbebbb1565e.png

好了关于文件上传,我们就简单介绍到这里,更多细节,请阅读 PHP 官方文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值