美文网首页
文件上传

文件上传

作者: LinoX | 来源:发表于2018-10-27 14:01 被阅读0次

    用户页面

    <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>
        注意:重命名不会修改文件后缀,如果不想重命名可以不填。<br>
        <input type="submit" name="submit" value="提交">
    </form>
    
    </body>
    </html>
    

    上传文件的类

    <?php
    /*
    **这个类是这次留的作业内容,要求是最迟在周六培训过后,新人全部了解mysql的基本操作之后,依靠数据库完成以下所有方法并实现一个上传文件的功能
    **所有对应的数据库操作务必使用PDO或mysqli来实现
    **mysqli鼓励使用面向对象的模式,而非面向过程
    **成员变量和成员方法都可以在我提供的基础上增加新的,可能只完善我写的这些未必能实现功能
    **可以当场质疑我一些变量或函数的必要性和合理性
    **上传的表单已经提供给你,你只需要完善这个类即可
    **测试过程详见upload_file.php
    **至于上传文件的原生写法,推荐自学教程:http://www.runoob.com/php/php-file-upload.html
    */
    class Upload{
        //以下函数可以增加,成员变量可以自由增删,我只是给出了一个比较可行的例子,只要你写的类能根据upload_file.php的逻辑实现文件的上传就行了
        var $realFile;//这是保存文件的变量,提示,它可以直接由php提供的$_FILES变量赋值
        var $name;//上传文件名
        var $size;//文件大小
        var $type; //文件类型
        var $cookie;
        static $maxSize = 20480000;//最大尺寸10000kb
        //允许的上传文件类型,实际上应该从数据库中读取,这里写死,请改用数据库
        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(){
            //删除可上传类型的函数,原则上从数据库中删除这一条
            //返回值,成功返回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(){
            //对当前对象执行上传的操作,提示:上传后文件的信息至少应当存在数据库的某个表中,要求图片和其他类型的文件能被分类到files和pictures两个目录中,命名格式自行发挥
            //返回值要求上传失败返回false即可,上传成功可以返回一个文件存储信息的json
            $mysqli = new mysqli('localhost', 'root','', 'upload');
            if (!$mysqli)
            {
                die("Connection Failed " . $mysqli->connect_error);
            }
    
            if ($this->realFile["error"] > 0)
            {
                echo "错误: " . $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 "文件类型: " . $this->realFile['type'] . "<br>";
                echo "文件大小: " . $this->size . "<br>";
                echo "文件临时存储目录: " . $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(){
            //上传限制的方法,主要用于检测文件的各项合法(如大小),如果你能考虑到更多安全的因素(不仅是文件类型),那么更能体现你的NB,至于
            //返回值默认只要合法返回true,不合法返回false,如果想分类错误类型,那么请优秀的你自行修改我upload_file.php里的逻辑以便更好地报错
            self::get_permit_types(); // 从数据库获取允许的类型
    
            $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(){
            //对用户上传的权限进行限制,根据要求应当每个用户(你如果觉得麻烦可以把用户的识别特征写成一个常量,只要这个函数可以正常执行就行了)
            //返回值默认只要合法返回true,不合法返回false,如果想分类错误类型,那么请优秀的你自行修改我upload_file.php里的逻辑以便更好地报错
    
            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;//由于规定上传成功后返回一个json
            }else{
                echo "文件上传失败!";
            }
        }else{
            echo "上传频率过快!请5分钟后再试";
        }
    }else{
        echo "文件不合法!";
    }
    

    实际效果

    正常上传 连续上传 修改文件名 修改后页面 实际修改效果 数据库1 数据库2

    相关文章

      网友评论

          本文标题:文件上传

          本文链接:https://www.haomeiwen.com/subject/qohdtqtx.html