zoukankan      html  css  js  c++  java
  • PHP文件上传,下载,Sql工具类!

    PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用

    前台 upload.html

    <!DOCTYPE html>
    <html>
    <head>
    	<title>文件上传</title>
    </head>
    <body>
    <form enctype="multipart/form-data" action="uploadProcess.php" method="post">
    	<table>
    		<tr><td align="center" colspan="2"><font style="font-size: 40px; font-family: 华文彩云;" >文件上传</font></td></tr>
    		<tr>
    		<td>请填写用户名:</td>
    		<td><input type="text" name="username"></td>
    		</tr>
    		<tr>
    		<td>介绍:</td>
    		<td><textarea name="intro" rows="10" cols="80"></textarea></td>
    		</tr>
    		<tr>
    		<td>请选择你要上传的文件</td>
    		<td><input type="file" name="myfile"></td>
    		</tr>
    		<tr><td><input type="submit" value="上传文件" /></td></tr>
    	</table>
    </form>
    </body>
    </html>
    

    控制器 FileProcess.php

    <?php 
    require_once 'FileService.php';
    $fileService = new FileService();
    
    if (!empty($_REQUEST['flag'])) {
        $flag = $_REQUEST['flag'];
        //上传
        if ($flag == "upload") {
            $username = $_POST['username'];
            $intro = $_POST['intro'];
    
            $fileService -> Upload($username,$intro);
        }elseif ($flag == "down") {
            //接收要下载的文件名字
            $filepath = $_GET['filepath'];
            $filename = $_GET['filename'];
              
     $fileService = new FileService();
     $fileService->Download($filepath,$filename);
    
        }
    }
    
     ?>

    后台 FileService.php

    <?php 
    header("content_type:text/html;charset=utf-8");
    require_once 'SqlHelper.php';
    error_reporting(E_ALL & ~E_NOTICE);
    
    class FileService{
    
    //查询所有文件信息
    function fileInfo(){
    
        $sql = "select * from upload";
        $sqlHelper = new SqlHelper();
    
        $res = $sqlHelper->execute_dpl($sql);
        return $res;
    
        $res->free();
    }
    
    
    /*
    *上传文件
    *    功能
    *        限制文件大小/类型
    *        防止不同用户上传同名图片被覆盖的问题
    *        防止同一用户上传的文件名相同的问题
    *    参数
    *        $username
    *        $intro
    *
    *is_uploaded_file  上传到tmp缓存
    *move_uploaded_file  移动到目标文件
    */
    function Upload($username,$intro){
    
    /*********对文件类型进行限制**********/
    
        //获取文件的大小,限制上传文件的大小10M
        $file_size = $_FILES['myfile']['size'];
        if ($file_size>10*1024*1024) {
        echo "<script>alert('上传失败,上传的文件不能超过10M的文件');history.go(-1);</script>";
        //echo "上传失败,上传的文件不能超过10M的文件!";
            exit();
        }
    
        //限制上传文件类型
        /*
        $file_type = $_FILES['myfile']['type'];
        if ($file_type!='image/jpg' && $file_type!='image/pjpeg') {
            echo "上传失败,文件类型只能是jpg格式!";
            exit();
        }*/
    
        //判断文件是否上传成功
        if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
            
    
    /***防止不同用户上传同名图片被覆盖的问题->给每个用户创建一个文件夹*****/
        //一般创建文件夹的时候根据id创建(username换成id,入参时带入id),防止汉字乱码
            //给每个用户动态创建一个相应的文件夹
            $user_path = $_SERVER['DOCUMENT_ROOT']."Demo/File/UpDown/upload/".$username;
            //判断该用户是否已经有文件夹
            if (!file_exists($user_path)) {
                mkdir($user_path);
            }
    
    
    /****防止同一用户上传的文件名相同的问题->给每个文件名加上时间戳********/
             //tmp里的文件名
             $file_name = $_FILES['myfile']['name'];
            //把缓存文件转存到你希望的目录
            $uploaded_file = $_FILES['myfile']['tmp_name'];
             //目标路径=(目标目录+用户名)+当前时间+后缀(strpos()字符串首次出现的位置)
             $move_to_file = $user_path."/".time().rand(1,1000).substr($file_name, strpos($file_name, "."));
    
    
            //对中文路径转码
            $move_to_file = iconv("utf-8", "gb2312", $move_to_file);
    
    /******************数据库操作***********************/
            //存入数据库
            $uptime = date('Y-m-d H:i:s');    //获取当前上传时间
    
            $sql = "insert into upload (username,fname,fsize,uptime,fpath,intro) values ('$username','$file_name','$file_size','$uptime','$move_to_file','$intro')";
    
            $sqlHelper = new SqlHelper();
            $res = $sqlHelper->execute_dml($sql);
    
        //判断是否将上传的文件移动到目标位置(先判断是否上传成功,再判断是否添加到数据库)
             if (move_uploaded_file($uploaded_file, $move_to_file)) {
    
                 //res=1表示添加上传成功
                if ($res == 1) {
                    
                    echo "<script>alert('{$_FILES['myfile']['name']}文件上传成功');window.location.href='down.php';</script>";
                }else{
                    echo "<script>alert('文件上传失败');history.go(-1);</script>";
                }
                 
             }else{
                 echo "<script>alert('文件上传失败');history.go(-1);</script>";
             }
            
        }else{
            echo "<script>alert('文件上传失败');history.go(-1);</script>";
        }
    }
    
    
    /**
    *
    * 参数说明:
    * 下载文件
    *  $filepath     文件路径 
    *  $filename     文件名
    *
    */
    function Download($filepath,$filename){
          //对中文文件名进行转码
        $filename=iconv("UTF-8","GB2312",$filename);   
          
        if(!file_exists($filepath)){ //检查文件是否存在
           echo "<script>alert('该文件不存在!');history.go(-1);</script>";
           // echo "该文件不存在!";
    
          return;
         }
          
          $fp = fopen($filepath, 'r');   //打开文件
          $file_size = filesize($filepath);  //计算文件大小
          
        if ($file_size>10*1024*1024) {
    
         echo "<script>window.alert('文件过大,您没权限下载')</script>";
         return;
        }
              //HTTP头部信息
            header("Content-type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Accept-Length: ".$file_size);
            header("Content-Disposition: attachment; filename=".$filename);
    
        $buffer = 1024;
        //为了下载安全,做一个文件字节读取计数器
        $file_count = 0;
        //判断文件是否结束 feof
        while (!feof($fp) && ($file_size-$file_count > 0)) {
          
           $file_data = fread($fp, $buffer);  //统计读了多少字节
           $file_count+=$buffer;
           
            echo "$file_data";  //把数据会送给浏览器
        }
          fclose($fp);
       }
    
    }
    
     ?>

     

    工具类  SqlHelper.php

    <?php
    
    /**
     *    sql工具类(dml,dpl,dpl_arr,close_link)
     *
     *1.创建MySqli对象
     *2.操作数据库(发送sql)
     *3.处理结果
     *4.关闭资源
     *
     */
    
    class SqlHelper {
        private $link;
        private static $host = 'localhost';
        private static $user = 'root';
        private static $pwd = '';
        private static $db = 'test';
        
        public  function __construct() {
         
            //初始化
            $this->link = new MYSQLi(self::$host,self::$user,self::$pwd,self::$db);
            if ($this->link->connect_error){
                die("数据库连接失败".$this->link->connect_error);
            }
            $this->link->query("set names utf8");
        }
        
          
        /**
         * dpl操作
         * @param unknown $sql
         */
        public function execute_dpl($sql){
            $res = $this->link->query($sql) or die("操作dpl失败".$this->link->error);
            return $res;
        }
        
        /**
         * dpl操作
         * @param $sql
         * @return arr
         *              把结果放在数组里。这样资源可以随时关闭,返回一个数组
         */
       
        public function execute_dpl_arr($sql){
            $arr = array();
            $res = $this->link->query($sql) or die("操作dpl_arr失败".$this->link->error);
            //把$res=>$arr,把结果集内容转移到一个数组中
            while ($row = $res->fetch_assoc()){
                $arr[] = $row;
            }
            //这里可以把资源立即关闭
            $res->free();
            return $arr;
        }
        
        
        /**
         * dml操作  update/delete/insert
         * @param unknown $sql
         */
        public function execute_dml($sql){
            
            $res = $this->link->query($sql) or die("操作dml失败".$this->link->error);
            if (!$res){
                return 0;   //失败
            }else {
                if ($this->link->affected_rows>0){
                    return 1;   //成功
                }else {
                    return 2;   //没有行受到影响
                }
            }
            $res->free();
        }
        
       
        //关闭链接
        public function close_link(){
            if (!empty($this->link)){
                $this->link->close();
            }
        }
    
    }
  • 相关阅读:
    JAVA 正则表达式 (超详细)
    Windows命令-route
    Spring3 MVC请求参数获取的几种方法[转]
    Linux-支持中文
    Linux-Tmux使用初体验
    Linux命令-工作管理命令:&,ctrl+z,jobs,fg,bg
    Linux命令-服务管理命令:chkconfig
    Linux命令-文件系统常用命令:df,du,fsck,dumpe2fs
    Linux命令-用户管理:useradd,userdel,usermod,id,su,env,exit
    Linux命令-某个用户组下面的所有用户
  • 原文地址:https://www.cnblogs.com/zxf100/p/6736071.html
Copyright © 2011-2022 走看看