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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM