需求:控制上传类型,可选上传后缀,控制上传大小
1、前台代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!doctype html>
<html lang="ch">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文件上传</title>
</head>
<body>
仅允许上传JPG,JPEG,PNG文件
<form method="post" action="index.php" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" value="上传" />
</form>
</body>
</html>
<?php
include 'upload.php';
$allow_type = array('image/jpg','image/jpeg','image/png');
$allow_format = array('jpg','jpeg','png');
$path = 'upload';
$error = '';
if (!empty($_FILES['image'])) {
$file = $_FILES['image'];
//var_dump($file);
$bool = api_upload($file, $allow_type, $path, $error, $allow_format, 1000000);
if (!$bool){
echo $error;
}else{
echo $bool;
}
}

2、函数代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
/*
* 函数功能:单文件上传
* @param0 array $file 需要上传的文件信息:$_FILES['name']
* @param1 array $allow_type 允许上传的文件类型
* @param2 string $path 上传路径
* @param3 string &$error 错误原因
* @param4 array $allow_format = array() 允许上传的文件后缀
* @param5 int $max_size = 2000000 允许上传的文件大小
* */

function api_upload($file,$allow_type,$path,&$error,$allow_format = array(),$max_size = 2000000){
//判断文件是否有效
if (!is_array($file) || !isset($file['error'])){
$error = '这不是一个有效的文件!';
return false;
}
//判断文件路径是否存在
if (!is_dir($path)){
$error = '文件路径不存在';
return false;
}
//检查文件上传过程中是否出错
switch ($file['error']){
case 1:
case 2:
$error = '大小超出限制';
return false;
case 3:
$error = '上传过程出错';
return false;
case 4:
$error = '用户没有选择文件';
return false;
case 6:
case 7:
$error = '文件写入失败';
return false;
}
//检查文件类型是否合法
if(!in_array($file['type'],$allow_type)){
$error = '禁止上传该类型文件';
return false;
}
//检查后缀名是否合法
$ext = ltrim(strrchr($file['name'],'.'),'.');
if (!empty($allow_format) && !in_array($ext,$allow_format)){
$error = '禁止上传该后缀文件';
return false;
}

//检查文件大小是否合法
if ($file['size'] > $max_size){
$error = '文件大小超过限制';
return false;
}

//检查文件是否为上传文件
if (!is_uploaded_file($file['tmp_name'])){
$error = '该文件不是上传文件';
return false;
}
//构造文件名:类型_时间戳.后缀
$name = strstr($file['type'],'/',true) . '_' . (string)time() . '.' . $ext;
//移动文件
if (move_uploaded_file($file['tmp_name'],$path. '/' . $name)){
$error = '文件上传成功';
return $path . '/' .$name;
}else{
$error = '文件移动失败';
return false;
}
}