文件上傳

用戶頁(yè)面

<html>
<head>
<meta charset="utf-8">
<title>文件/圖片上傳</title>
</head>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文&nbsp&nbsp&nbsp&nbsp件:</label>
    <input type="file" name="file" id="file"><br>
    <label for="new_name">命名為:</label>
    <input type="text" name="new_name" id="new_name"><br>
    注意:重命名不會(huì)修改文件后綴欲低,如果不想重命名可以不填。<br>
    <input type="submit" name="submit" value="提交">
</form>

</body>
</html>

上傳文件的類(lèi)

<?php
/*
**這個(gè)類(lèi)是這次留的作業(yè)內(nèi)容掌呜,要求是最遲在周六培訓(xùn)過(guò)后措伐,新人全部了解mysql的基本操作之后线召,依靠數(shù)據(jù)庫(kù)完成以下所有方法并實(shí)現(xiàn)一個(gè)上傳文件的功能
**所有對(duì)應(yīng)的數(shù)據(jù)庫(kù)操作務(wù)必使用PDO或mysqli來(lái)實(shí)現(xiàn)
**mysqli鼓勵(lì)使用面向?qū)ο蟮哪J角耄敲嫦蜻^(guò)程
**成員變量和成員方法都可以在我提供的基礎(chǔ)上增加新的昆烁,可能只完善我寫(xiě)的這些未必能實(shí)現(xiàn)功能
**可以當(dāng)場(chǎng)質(zhì)疑我一些變量或函數(shù)的必要性和合理性
**上傳的表單已經(jīng)提供給你吊骤,你只需要完善這個(gè)類(lèi)即可
**測(cè)試過(guò)程詳見(jiàn)upload_file.php
**至于上傳文件的原生寫(xiě)法,推薦自學(xué)教程:http://www.runoob.com/php/php-file-upload.html
*/
class Upload{
    //以下函數(shù)可以增加善玫,成員變量可以自由增刪水援,我只是給出了一個(gè)比較可行的例子,只要你寫(xiě)的類(lèi)能根據(jù)upload_file.php的邏輯實(shí)現(xiàn)文件的上傳就行了
    var $realFile;//這是保存文件的變量茅郎,提示,它可以直接由php提供的$_FILES變量賦值
    var $name;//上傳文件名
    var $size;//文件大小
    var $type; //文件類(lèi)型
    var $cookie;
    static $maxSize = 20480000;//最大尺寸10000kb
    //允許的上傳文件類(lèi)型或渤,實(shí)際上應(yīng)該從數(shù)據(jù)庫(kù)中讀取系冗,這里寫(xiě)死,請(qǐng)改用數(shù)據(jù)庫(kù)
    static $files_types = array();
    static $pictures_types = array();
    public function __construct($realFile, $name, $size, $type) {
        $this->realFile = $realFile;
        $this->name = $name;
        $this->size = $size;
        $this->type;
    }

    private static function get_permit_types()
    {
        $mysqli = new mysqli('localhost', 'root','', 'upload');
        if (!$mysqli)
        {
            die("Connection Failed " . $mysqli->connect_error);
        }
        $res1 = $mysqli->query('select allow_types from filetypes');
        $res2 = $mysqli->query('select pic_allow_types from pictypes');
        $i = 0;
        while($row = $res1->fetch_array(MYSQLI_ASSOC))
        {
            self::$files_types[$i++] = $row['allow_types'];
        }
        while($row = $res2->fetch_array(MYSQLI_ASSOC))
        {
            self::$pictures_types[$i++] = $row['pic_allow_types'];
        }
        if(isset(self::$files_types) and isset(self::$pictures_types))
        {
            $res1->free();
            $res2->free();
            $mysqli->close();
            return true;
        }
        else
        {
            $res1->free();
            $res2->free();
            $mysqli->close();
            return false;
        }
    }

    public function add_type(){
        $mysqli = new mysqli('localhost', 'root','', 'upload');
        if (!$mysqli)
        {
            die("Connection Failed " . $mysqli->connect_error);
        }

        $sql1 = "insert into filetypes(allow_types) VALUES ('')";
        $sql2 = "insert into pictypes(pic_allow_types) VALUES ('')";

        if($mysqli->query($sql1) or $mysqli->query($sql2))
        {
            $mysqli->close();
            return true;
        }
        else
        {
            $mysqli->close();
            return false;
        }
    }

    public function delete_type(){
        //刪除可上傳類(lèi)型的函數(shù)薪鹦,原則上從數(shù)據(jù)庫(kù)中刪除這一條
        //返回值掌敬,成功返回true,失敗返回false即可
        $mysqli = new mysqli('localhost', 'root','', 'upload');
        $sql1 = "delete from filetypes where allow_types =''";
        $sql2 = "delete from pictypes where pic_allow_types =''";
        if($mysqli->query($sql1) or $mysqli->query($sql2))
        {
            $mysqli->close();
            return true;
        }
        else
        {
            $mysqli->close();
            return false;
        }
    }

    public function upload(){
        //對(duì)當(dāng)前對(duì)象執(zhí)行上傳的操作,提示:上傳后文件的信息至少應(yīng)當(dāng)存在數(shù)據(jù)庫(kù)的某個(gè)表中池磁,要求圖片和其他類(lèi)型的文件能被分類(lèi)到files和pictures兩個(gè)目錄中奔害,命名格式自行發(fā)揮
        //返回值要求上傳失敗返回false即可,上傳成功可以返回一個(gè)文件存儲(chǔ)信息的json
        $mysqli = new mysqli('localhost', 'root','', 'upload');
        if (!$mysqli)
        {
            die("Connection Failed " . $mysqli->connect_error);
        }

        if ($this->realFile["error"] > 0)
        {
            echo "錯(cuò)誤: " . $this->realFile["error"] . "<br>";
            return false;
        }
        else {
            self::get_permit_types();
            $temp = explode('.', $this->name);
            $extension = end($temp);
            if(in_array($extension, self::$files_types))
            {
                move_uploaded_file($this->realFile["tmp_name"], "D:/Project/homework/files/" . $this->name);
                $name = $this->name;
                $type = $this->realFile['type'];
                $size = $this->size;
                $path = 'D:/Project/homework/files';
                $sql3 = "insert into files(filename, type, size, path) values('$name', '$type', '$size', '$path')";
                if(!$mysqli->query($sql3))
                {
                    return false;
                }
            }
            if(in_array($extension, self::$pictures_types))
            {
                move_uploaded_file($this->realFile["tmp_name"], "D:/Project/homework/pictures/" . $this->name);
                $name = $this->name;
                $type = $this->realFile['type'];
                $size = $this->size;
                $path = 'D:/Project/homework/pictures';
                $sql3 = "insert into pics(filename, type, size, path) values('$name', '$type', '$size', '$path')";
                if(!$mysqli->query($sql3))
                {
                    return false;
                }
            }
            echo "上傳文件名: " . $this->name . "<br>";
            echo "文件類(lèi)型: " . $this->realFile['type'] . "<br>";
            echo "文件大小: " . $this->size . "<br>";
            echo "文件臨時(shí)存儲(chǔ)目錄: " . $this->realFile['tmp_name'] . "<br>";
            echo "文件所在目錄" . 'D:/Project/homework/pictures/' . $this->name . "<br>";
            $result = array(
                'name' => $this->name,
                'type' => $this->realFile['type'],
                'size' => $this->realFile['size'],
                'temp' => $this->realFile['tmp_name']
            );
            setcookie('upload_file','upload_file', time()+300);
            return json_encode($result);
        }
    }

    public function limit(){
        //上傳限制的方法地熄,主要用于檢測(cè)文件的各項(xiàng)合法(如大小)华临,如果你能考慮到更多安全的因素(不僅是文件類(lèi)型),那么更能體現(xiàn)你的NB,至于
        //返回值默認(rèn)只要合法返回true,不合法返回false端考,如果想分類(lèi)錯(cuò)誤類(lèi)型雅潭,那么請(qǐng)優(yōu)秀的你自行修改我upload_file.php里的邏輯以便更好地報(bào)錯(cuò)
        self::get_permit_types(); // 從數(shù)據(jù)庫(kù)獲取允許的類(lèi)型

        $temp = explode('.', $this->name);
        $extension = end($temp);
        if($this->size > self::$maxSize)
        {
            return false;
        }
        elseif(!in_array($extension, self::$files_types)
                and !in_array($extension, self::$pictures_types))
        {
            return false;
        }
        else
        {
            return true;
        }

    }

    public function user_limit(){
        //對(duì)用戶上傳的權(quán)限進(jìn)行限制,根據(jù)要求應(yīng)當(dāng)每個(gè)用戶(你如果覺(jué)得麻煩可以把用戶的識(shí)別特征寫(xiě)成一個(gè)常量却特,只要這個(gè)函數(shù)可以正常執(zhí)行就行了)
        //返回值默認(rèn)只要合法返回true,不合法返回false扶供,如果想分類(lèi)錯(cuò)誤類(lèi)型,那么請(qǐng)優(yōu)秀的你自行修改我upload_file.php里的邏輯以便更好地報(bào)錯(cuò)

        if(!isset($_COOKIE['upload_file']))
        {
            return true;
        }
        if(isset($_COOKIE['upload_file']))
        {
            return false;
        }
    }

    public function rename($new_name){
        //修改上傳文件名的方法裂明,傳入name則改名椿浓,不傳則不改名
        //改名返回true,未修改返回false
        if($new_name != '')
        {
            $temp = explode('.', $this->realFile['name']);
            $extension = end($temp);
            $this->name = $new_name . '.' . $extension;
            return true;
        }
        if($new_name == '')
        {
            return false;
        }
    }

}

上傳文件的腳本闽晦。

<?php
require_once("upload.class.php");

$myFile = new Upload($_FILES['file'],
                     $_FILES['file']['name'],
                     $_FILES['file']['size'],
                     $_FILES['file']['type']);

$myFile->rename($_POST["new_name"]);//嘗試重命名
if($myFile->limit()){
    if($myFile->user_limit()){
        if($result = $myFile->upload()){
            echo "文件上傳成功!" . "<br>";
            echo $result;//由于規(guī)定上傳成功后返回一個(gè)json
        }else{
            echo "文件上傳失敯獍!";
        }
    }else{
        echo "上傳頻率過(guò)快尼荆!請(qǐng)5分鐘后再試";
    }
}else{
    echo "文件不合法左腔!";
}

實(shí)際效果

正常上傳
連續(xù)上傳
修改文件名
修改后頁(yè)面
實(shí)際修改效果
數(shù)據(jù)庫(kù)1
數(shù)據(jù)庫(kù)2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捅儒,隨后出現(xiàn)的幾起案子液样,更是在濱河造成了極大的恐慌振亮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞭莽,死亡現(xiàn)場(chǎng)離奇詭異坊秸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)澎怒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)褒搔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人喷面,你說(shuō)我怎么就攤上這事星瘾。” “怎么了惧辈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵琳状,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盒齿,道長(zhǎng)念逞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任边翁,我火速辦了婚禮翎承,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘符匾。我一直安慰自己叨咖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布待讳。 她就那樣靜靜地躺著芒澜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪创淡。 梳的紋絲不亂的頭發(fā)上痴晦,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音琳彩,去河邊找鬼誊酌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛露乏,可吹牛的內(nèi)容都是我干的碧浊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瘟仿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箱锐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劳较,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驹止,失蹤者是張志新(化名)和其女友劉穎浩聋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臊恋,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衣洁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抖仅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊夫。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撤卢,靈堂內(nèi)的尸體忽然破棺而出环凿,到底是詐尸還是另有隱情,我是刑警寧澤凸丸,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布拷邢,位于F島的核電站,受9級(jí)特大地震影響屎慢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忽洛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一腻惠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欲虚,春花似錦集灌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梯找,卻和暖如春唆阿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锈锤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工驯鳖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人久免。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓浅辙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阎姥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子记舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容