PHP封装文件上传类
1、编写文件上传类文件
FileUploader.php:
<?php //文件上传 namespace vendor; class FileUploader{ //设定属性:保存允许上传的MIME类型 private static $types = array('image/jpg', 'image/jpeg', 'image/pjpeg'); //修改允许上传类型 public static function setTypes($types = array()){ //判定是否为空 if (!empty($types)) self::$types = $types; } public static $error; //记录单文件上传过程中出现的错误信息 public static $errors; //记录多文件上传过程中出现的错误信息 public static $files; //记录多文件上传成功后文件名对应信息 /** * @desc 单文件上传 * @param string $file,上传文件信息数组 * @param string $path,上传路径 * @param int $max = 2M,最大上传大小 * @return bool|string,成功返回文件名,失败返回false */ public static function uploadOne($file, $path, $max = 2000000){ //判定文件有效性 if (!isset($file['error']) || count($file) != 5) { self::$error = '错误的上传文件!'; return false; } //路径判定 if (!is_dir($path)) { self::$error = '存储路径不存在!'; return false; } //判定文件是否正确上传 switch ($file['error']) { case 1: case 2: self::$error = '文件超过服务器允许大小!'; return false; case 3: self::$error = '文件只有部分被上传!'; return false; case 4: self::$error = '没有选中要上传的文件!'; return false; case 6: case 7: self::$error = '服务器错误!'; return false; } //判定文件类型 if (!in_array($file['type'], self::$types)) { self::$error = '当前上传的文件类型不允许!'; return false; } //判定业务大小 if ($file['size'] > $max) { self::$error = '当前上传的文件超过允许的大小!当前允许的大小是:' . (string)($max / 1000000) . 'M'; return false; } //获取随机名字 $filename = self::getRandomName($file['name']); //移动上传的临时文件到指定目录 if (move_uploaded_file($file['tmp_name'], $path . '/' . $filename)) { //成功 return $filename; } else { //失败 self::$error = '文件移动失败!'; return false; } } /** * @desc 多文件上传 * @param array $files,上传文件信息二维数组 * @param string $path,上传路径 * @param int $max = 2M,最大上传大小 * @return bool 是否全部上传成功 */ public static function uploadAll($files, $path, $max = 2000000){ for($i = 0, $len = count($files['name']); $i < $len; $i++){ $file = array( 'name' =>$files['name'][$i], 'type' =>$files['type'][$i], 'tmp_name' =>$files['tmp_name'][$i], 'error' =>$files['error'][$i], 'size' =>$files['size'][$i] ); $res = self::uploadOne($file, $path, $max); if(!$res){ //错误处理 $error = self::$error; self::$errors[] = "文件:{$file['name']}上传失败:{$error}!<br>"; }else{ self::$files[] = $file['name']. '=>'. $res; } } if(!empty(self::$errors)){ //错误处理 //var_dump(self::$errors); return false; }else{ return true; } } /** * @desc 获取随机文件名 * @param string $filename,文件原名 * @param string $prefix,前缀 * @return string,返回新文件名 */ public static function getRandomName($filename, $prefix = 'image'){ //取出源文件后缀 $ext = strrchr($filename, '.'); //构建新名字 $new_name = $prefix . date('YmdHis'); //增加随机字符(6位大写字母) for ($i = 0; $i < 6; $i++) { $new_name .= chr(mt_rand(65, 90)); } //返回最终结果 return $new_name . $ext; } }
2、测试
注意:以下测试文件都和类文件放在同一文件夹,且该文件需要有一个upload子文件夹
测试表单index.html:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>文件上传</title> </head> <body> 单文件上传表单 <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit"><br> </form> <br> 多文件上传表单 <form action="uploadall.php" method="post" enctype="multipart/form-data"> <input name="file[]" type="file"><br> <input name="file[]" type="file"><br> <input name="file[]" type="file"><br> <input type="submit"/><br> </form> </body> </html>
单文件上传表单处理文件upload.php:
<?php include 'FileUploader.php'; $file = $_FILES['file']; vendor\FileUploader::setTypes(array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png')); $res = vendor\FileUploader::uploadOne($file, 'upload'); if($res) echo "文件上传成功,更名为{$res}<br>"; else{ $error = vendor\FileUploader::$error; echo "文件上传失败,error:{$error}!<br>"; }
多文件上传表单处理文件uploadall.php:
<?php include 'FileUploader.php'; use vendor\FileUploader; $files = $_FILES['file']; FileUploader::setTypes(array('image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png')); $res = FileUploader::uploadAll($files, 'upload', 2000000); if($res){ echo '文件上传成功,文件重命名信息如下:<br>'; foreach(FileUploader::$files as $file){ echo $file. '<br>'; } }else{ echo '文件没有全部上传成功,错误信息如下:<br>'; foreach(FileUploader::$errors as $error){ echo $error. '<br>'; } }
FileUploader