index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="demo.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file">
<button>提交</button>
</form>
</body>
</html>
demo.php
//print_r($_FILES);
//Array
//(
// [my_file] => Array
// (
// [name] =>
// [type] =>
// [tmp_name] =>
// [error] => 4
// [size] => 0
// )
//)
//设置时区
ini_set('date.timezone','Asia/Shanghai');
//判断上传文件是否存在
if (empty($_FILES['my_file']['tmp_name'])) {
echo '<script>alert("请选择上传的文件");location.assign("index.html");</script>';
exit;
}
//1,配置上传参数
//设置允许上传的文件类型
$fileType = ['jpg','jpeg','png','gif'];
//设置允许上传的最大文件长度
$fileSize = 3145728;
//上传到服务器上指定的目录
$filePath = '/uploads/';
//上传的原始文件名
$fileName = $_FILES['my_file']['name'];
//上传保存在服务器上的临时文件名
$tempFile = $_FILES['my_file']['tmp_name'];
//2,判断上传是否成功
$uploadError = $_FILES['my_file']['error'];
if ($uploadError > 0){
switch ($uploadError){
case 1:
case 2:die('上传文件不允许超过3M');
case 3:die('上传文件不完整');
case 4:die('没有文件被上传');
case 6:die('找不到临时文件夹');
case 7:die('文件写入失败');
default: die('未知错误');
}
}
//3.判断文件扩展名是否正确
//strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
//strrpos() 查找 "." 在字符串中最后一次出现的位置,返回位置 substr($fileName, strrpos($file, '.')+1);从该位置开始截取
$extension = substr(strrchr($fileName, '.'), 1);
if (!in_array($extension, $fileType)){
die('不允许上传'. $extension . '文件类型');
}
//限制上传文件大小
if ($_FILES["my_file"]["size"] > $fileSize){
echo '<script>alert("上传文件不允许超过3M");location.assign("index.html");</script>';
exit;
}
//4,文件重命名,为了防止同名文件相互覆盖,应该讲上传到指定目录的文件重命名,例如用md5+时间戳
$fileName = date('YmdHis',time()).md5(mt_rand(1,99)). '.' . $extension;
//5,判断文件是否上传成功
//is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的。
if (is_uploaded_file($tempFile)){
if (move_uploaded_file($tempFile, __DIR__ . $filePath . $fileName)){
echo '<script>alert("上传成功");history.back();</script>';
}else{
die('文件无法移动到指定目录,请检查目录权限');
}
}else{
die('非法操作');
}
总结:
- 接收文件上传信息用
$_FILES
这个全局变量 - 获取文件扩展名可以用
explode()
切割字符串,也可以用strrchr()
查找特征字符串出现的位置再截取 - is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的