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
