作业:文件上传,封装一个单文件上传的函数
文件上传表单demo1.php
<?php
// 一. 上传表单enctype属性应设置说明:
// enctype="multipart/form-data"
// multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
// 需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,
// 只有使用了multipart/form-data,才能完整的传递文件数据。
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>单文件上传</title>
</head>
<body>
<form action="demo2.php" method="post" enctype="multipart/form-data">
<fieldset>
<legend>单文件上传</legend>
<input type="file" name="my_file">
<button>上传</button>
</fieldset>
</form>
</body>
</html>
封装函数文件libtext.php
<?php
// 上传文件的描述信息,全部保存在系统全局变量`$_FILES`中,包括:
// name文件在客户端的原始文件名
// type文件的 MIME 类型, 由浏览器提供
// tmp_name 文件被上传到服务器上之后,在临时目录中临时文件名
// error 文件上传相关的错误代码
// size 已上传文件的大小
function upload(array $fileInfo,$uploadPath="uploads",$flag = true,$allowExt=['jpg','jpeg','png','wbmp','gif'],$maxSize=2097152){
// 防止文件重名产生覆盖
$fileRealPath = $path.md5($prefix.time()).'.'.$ext;
// 判断文件上传是否出错
if( $fileInfo['error'] != 0)
{
return false;
}
//检验图片是否真实
// getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
if($flag)
{
if(!getimagesize($fileInfo['tmp_name']))
{
die('不是真实图片,get out~');
}
}
// 判断文件大小是否合规
if($fileInfo['size'] > $maxSize)
{
die('文件大小超过限制的最大值~');
}
// 拿到文件后缀:explode() 函数把字符串打散为数组。array_pop() 函数删除数组中的最后一个元素。in_array() 函数搜索数组中是否存在指定的值
$ext = array_pop(explode('.',$fileInfo['name'])) ;
// 判定上传的文件类型是否合规
if(!in_array($ext,$allowExt))
{
die('非法的文件类型');
}
// is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
if(!is_uploaded_file($fileInfo['tmp_name']))
{
die('上传方式错误:请使用http post方式上传');
}
// 原始图片的前缀,防止文件重名产生覆盖 ,文件真正储存的位置
$prefix = array_shift(explode('.',$fileInfo['name'])) ;
// 判断目录是否存在,如果不存在创建,并且设置权限
if(!file_exists($uploadPath))
{
//允许全局访问
mkdir($uploadPath,0777,true);
chmod($uploadPath,0777);
}
// 定义文件移动后在名称
$fileRealPath = $uploadPath.'/'.md5($prefix.time()).'.'.$ext;
// 判断文件是否上传(移动)成功
// move_uploaded_file — 将上传的文件移动到新位置
if (!move_uploaded_file($fileInfo['tmp_name'],$fileRealPath))
{
die('文件上传失败');
}
//返回文件路径
return $fileRealPath;
}
后端调用函数处理请求demo2.php
<?php
// 二. 作为后端程序员,对用户上传的文件(比如:图片)限制项:
// 1、文件是否真实
// 2、文件大小超过限制的最大值
// 3、非法的文件类型
// 4、上传方式:需要使用http post方式上传
// 5、文件是否上传成功
// 三. 案例:封装一个适合(单)文件上传的函数:
// 1、require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
// 2、常量__DIR__,指向当前执行的PHP脚本所在的目录。
// 3、DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是PHP的内部常量,不需要任何定义与包含即可直接使用
require_once __DIR__ . DIRECTORY_SEPARATOR . 'lib'. DIRECTORY_SEPARATOR . 'libtext.php';
$fileInfo = $_FILES['my_file'];
$newName = upload($fileInfo,'storages/uploads');
echo $newName;
// 输出结果:storages/uploads/e14d94cc10e2af8eaedc5be515078ea0.jpg