1、文件上传原理
- 上传文件,就是将文件从浏览器端传到服务器端;
- 上传文件,必须使用
<form>
标记来向服务器端发数据; - 上传文件,
<form>
标记的method属性值必须是POST; - 上传文件,
<form>
标记的enctype属性值必须是multipart/form-data; - 上传文件,必须使用
<input type = ‘file' name='upload'>
标记实现。
HTML页面代码:
<form name="form" method="post" enctype="multipart/form-data" action="./uploadFileProcedure.php">
文件上传:<input type="file" name="uploadFile"><br>
<input type="submit" value="提交">
<!-- 定义一个用于上传文件页面验证的隐藏域,防止黑客攻击 -->
<input type="hidden" name="token" value="upload">
</form>
2、超全局变量数组 $_FILES
- $_POST数组中保存的是普通表单元素数据;
- $_FILES数组中保存的是上传文件的信息。
3、上传文件错误代码
提示:0、1、4比较重要。
4、查看上传的临时文件位置
上传文件的默认临时目录,如果没有指定php.ini配置项upload_tmp_dir的值,则使用操作系统临时目录(c:windowstemp)。通过phpinfo()函数查看。
为什么在 c:\windows\temp 中看不到上传文件呢?因为临时文件是短暂存在的,也就是在脚本执行完毕后,就消失了。
5、将上传文件移动到新位置
描述:本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。最好在临时文件没有消失前移动。
语法:
bool move_uploaded_file ( string $filename , string $destination )
参数:$filename,指定上传的临时文件名;$destination,指定新的文件名路径;
注意:如果文件已经存在,则会覆盖操作。
6、上传文件的相关配置(php.ini)
upload_max_filesize
配置:上传单个文件的大小限制,默认为2MB。post_max_size
配置:规定上传多个文件的总大小,默认为8MB。max_file_uploads
配置:规定最多上传的文件个数,默认为20个。
7、获取文件路径信息 pathinfo()
- 描述:返回文件路径的信息 ;
语法:
mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
参数:
- $path,要解析的路径。
$options,如果省略,返回全部单元;
- PATHINFO_DIRNAME,目录名称;
- PATHINFO_BASENAME,文件名称;
- PATHINFO_EXTENSION,扩展名;
- PATH_FILENAME,文件名。
8、检查数组中是否存在某个值 in_array()
- 描述:检查数组中是否存在某个值
语法:
bool in_array ( mixed $needle , array $arr )
- 参数:$needle检索的值,$arr原数组。
9、生成唯一ID uniqid()
- 描述:生成一个唯一ID
语法:
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
参数:
- $prefix前缀字符串,如果省略,返回字符串长度为13;
- $more_entropy后缀字符串,如果为true,返回字符串长度为23。
实例:单个文件上传
1、上传表单制作upload.html
2、上传文件的程序处理upload.php
代码:
HTML页面
<!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 name="form" method="post" enctype="multipart/form-data" action="./uploadFileProcedure.php">
文件上传:<input type="file" name="uploadFile"><br>
<input type="submit" value="提交">
<!-- 定义一个用于上传文件页面验证的隐藏域,防止黑客攻击 -->
<input type="hidden" name="token" value="upload">
</form>
</body>
</html>
PHP程序
<?php
// 判断表单提交是否合法,防止黑客攻击
if (!(isset($_POST['token']) && $_POST['token'] == "upload")) {
die("<h2>非法渠道上传!!!</h2>");
}
// 判断上传过程是否有错误
$uploadFile = $_FILES['uploadFile']; // 获取的数组为多维,进行减维处理
$errorCode = $uploadFile['error'];
if ($errorCode != 0) {
die("<h2>文件上传错误,错误码:" . $errorCode . "</h2>");
}
// 判断文件大小是否超过2MB = (2 * 1024 * 1024)字节
if ($uploadFile['size'] > 2 * 1024 * 1024) {
die("<h2>文件大小超过限制!请控制在2MB以内!</h2>");
}
// 判断上传的文件是否为图片
$imgTypeArr = ['jpg', 'webp', 'gif', 'png']; // 定义一个上传文件的所有类型数组
$imgTypeStr = implode(',', $imgTypeArr); // 将文件类型数组合并为一个字符串用于打印提示信息
$imgName = $uploadFile['name']; // 获取上传文件的文件名
$uploadFileSuffix = pathinfo($imgName, PATHINFO_EXTENSION); // 获取上传文件的文件后缀
if (!in_array($uploadFileSuffix, $imgTypeArr)) {
die("<h2>上传的图片格式必须为:" . $imgTypeStr . "中的一种!!!</h2>");
}
// 移动临时文件到上传目录中
$imgUploadPath = "./uploads/" . uniqid() . '.' . $uploadFileSuffix; // 创建上传路径
$imgTempPath = $uploadFile['tmp_name']; // 获取windows临时存储路径
$uploadResult = move_uploaded_file($imgTempPath, $imgUploadPath); // 上传文件
// 对上传结果进行判断
if (!$uploadResult) {
die("<h2>文件在服务器写入失败!!!</h2>");
}