下面是封装代码
function upload_single($file, $allow_type, $path, &$error, $allow_format = array(), $max_size)
{
// 1.判断文件是否有效
if (!is_array($file) || !isset($file['error'])) {
// (不是一个文件,或者文件里没有参数error)文件无效
$error = '不是一个有效的上传文件!';
return false;
}
// 2.判断文件路径是否有效 is_dir,判断给定参数是否是一个路径,返回值为布尔值.
if (!is_dir($path)) {
//路径不存在
$error = "文件路径不存在!";
return false;
}
//3.判断文件上传的过程中是否出错
switch ($file['error']) {
case 1:
case 2:
$error = "文件超出服务器允许大小";
return false;
case 3:
$error = "文件上传过程里出现问题,只上传了部分";
return false;
case 4:
$error = "用户未选中要上传文件";
return false;
case 5:
case 6:
$error = "文件保存失败";
return false;
}
// 4.判断MINE类型 in_array — 检查数组中是否存在某个值
if (!in_array($file['type'], $allow_type)) {
$error = "当前文件类型不支持上传!";
return false;
}
// 5.判断后缀是否允许
// 取后缀,取出的结果默认带有点号 如.exe .txt
$ext = ltrim(strrchr($file['name'], '.'), '.');
if (!empty($allow_format) && !in_array($ext, $allow_format)) {
// 不允许上传
$error = "当前文件的格式不允许上传!";
return false;
}
// 6.判断文件大小是否满足业务需求
if ($file['size'] > $max_size) {
// 文件过大
$error = '当前上传文件超出大小,最大允许为' . $max_size . "字节";
}
// 7.2.构造文件名:类型 年 月 日+随机字符串.$ext strstr:
$fullname = strstr($file['type'], '/', TRUE) . date('YYYYmmdd');
// 产生随机字符串
for ($i = 0; $i < 4; $i++) {
// chr():可以将得到的数值转化为字母
$fullname .= chr(mt_rand(65, 90));
}
// 拼凑后缀
$fullname .= '.' . $ext;
//7.移动到指定目录
if (!is_uploaded_file($file['tmp_name'])) {
// 文件非上传
$error = '错误:不是上传文件';
return false;
}
if (move_uploaded_file($file['tmp_name'], $path . '/' . $fullname)) {
// 上传成功
return $fullname;
} else {
// 移动失败
$error = '文件上传失败';
return false;
}
};
// 提供数据
$file = $_FILES['image'];
$path = 'uploads/';
$allow_type = array('image/jpg', 'image/jpeg', 'image/gif');
$allow_format = array('jpg', 'gif', 'jpeg');
$max_size = '8000000';
if ($filename = upload_single($file, $allow_type, $path, $error, $allow_format, $max_size)) {
echo $filename;
} else {
echo $error;
};