GET请求和POST请求、文件上传操作
2019-02-20 本文已影响6人
羽翼的翼
GET请求和POST请求
文件上传遵循的流程:
选取文件提交 ==> 存入服务器暂存区 ==> 有后续操作后存入到服务器
步骤1:在表单中提交
☆ 在php中文件上传必须得是post
请求
☆ 必须给表单设置enctype
属性
/*
1, 必须给表单设置enctype属性
application/x-www-form-unlencoded 将参数编码为键值对的格式,标准格式
(UTF-8 GBK GB2312) 用来处理字符串,默认的编码格式
multipart/form-data 专门用来处理特殊文件,比如文件
*/
<form action=<?php echo $_SERVER['PHP_SELF'] ?> method="post" enctype="multipart/form-data">
文件选择: <input type="file" name="myFile"> <br>
<input type="submit">
</form>
步骤2:在php代码中接收
☆ 1. 在php中,上传之后的相关信息都存储在$_FILES
超全局变量中
☆ 2.使用一个方法来实现文件的移动,否则文件将在程序结束后被自动遗弃
☆ 3.move_uploaded_file
(源文件的全路径, 目标文件的全路径)
☆ 4.文件夹是手动创建的
<?php
// 在php中,上传之后的相关信息都存储在 $_FILES 超全局变量中
print_r($_FILES)
/*
Array(
[myFile] => Array(
[name] => xxx.jpg (源文件的名称)
[type] => image/png (源文件的类型)
[tmp_name] => C:\windows\phpE412.tmp (保存文件的路径)
[error] => 0
[size] => 256436
)
)
*/
// 使用一个方法来实现文件的移动,否则文件将在程序结束后被自动遗弃
// move_uploaded_file(源文件的全路径, 目标文件的全路径)
// 文件夹是手动创建的
move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png")
?>
补充说明(1)
由于发送的是post
请求,结果文件一打开的时候就开始了一些操作,发现报错了
所以,在打开文件的时候,还得需要一些判断
<?php
// 判断当前的数组是否为空,为空则不进入
if(!empty($_FILES)) {
move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png")
}
?>
// !!!通过表单元素的属性,限制文件上传的格式
// 1, 在表单元素中可以限制
<input type="file" accept=".jpg,.png" />
// 2, 在后端进行判断
<?php
if(!empty($_FILES)) {
$type = $_FILES["myFile"]["type"];
// ***** strpos(源字符,搜索字符) 可以获取指定字符串在源字符中第一次出现的索引
if(strpos($type, "image/") === 0) {
move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/temp.png");
}else {
echo "您选择的不是一张图片";
}
}
?>
文件名称不固定,设置合理的文件名称
<?php
// 获取当前文件的名称
$fileName = $_FILES["myFile"]["name"];
// 拼接文件的名称
// move_uploaded_file($_FILES["myFile"]["tmp_name"], "./upload/".$fileName);
// ???? 如果两次都是一次名字,很有可能重名,然后会覆盖之前的文件
// 生成随机数,时间是唯一的
// $myname = time();
// strrchr(源字符串,指定搜索的字符串)
$extension = strrchr($fileName, "."); // 如果是 demo.png , 就能获取到后面的 .png
$myname = time().rand(1000, 9999).$extension; // 得到一个随机的唯一的值, 还带扩展名
?>
上传文件.jpg
补充说明(2)
当上传的文件比较大的时候,会出不来想要的效果
而此时,得到的$_FILES
数组中,error
指向的值为1
根据查询手册得知,这里的意思指的是,上传的文件超出了大小
如果需要修改大小的范围,需要修改配置文件
搜索相关的信息
maxload.jpg
得到对应的位置之后,发现默认为2M的大小
modefieLoad.jpg
修改完毕之后,一定要记得
重启服务器
!!!
服务器对每一次post请求传递做了限制,默认为8M
可以修改配置文件,改大对应的值,搜索post_max_size
和上图操作类似 找到 php-ini配置
找到位置后,该变原有的大小
补充说明(3)
同时上传多个文件
在选择的表单元素中加入multiple
, 则可以选中多个文件
<input type="file" name="myfile" multiple>
1.0 如果需要后端服务器的 $_FILES 接收多个文件
,则需要在name属性值
后面加上[ ]
<input type="file" name="myfile[]" multiple>
2.0 实现完成效果
<?php
/*
Array(
[myfile] => Array(
[name] => Array(
[0] => 11.png
[1] => 111222.jpg
)
[tmp_name] => Array(
[0] => C:\Windows\phpc51.tmp
[1] => C:\Windows\phpc62.tmp
)
)
)
*/
if(!empty($_FILES)) {
// 获取扩展名的数组
$nameArr = $_FILES["myfile"]["name"];
$pathArr = $_FILES["myfile"]["tmp_name"];
foreach($pathArr as $key => $value) {
// 获取唯一的图片名称
$name = time().rand(1000, 9999).strrchr($nameArr[$key], ".");
// 将文件存储到永久目录 move_upload_file
move_upload_file($value, "./upload/".$name);
}
}
?>