• 欢迎访问IT乐园(o゚▽゚)o
  • 推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。

上传文件实例(后端php)

php fhy 8年前 (2017-03-16) 6259次浏览 0个评论

php 上传文件类:

<?php
  /** 
   * file: fileupload.class.php 文件上传类 FileUpload
   *本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传
   */
  class FileUploadComponent extends Object { 
    private $path = "./uploads";          //上传文件保存的路径
    private $allowtype = array('jpg','gif','png'); //设置限制上传文件的类型
    private $maxsize = 1000000;           //限制文件上传大小(字节)
    private $israndname = true;           //设置是否随机重命名文件, false 不随机
    private $isshowfirm = false;          //是否拼接 firmid 需要开启随机重命名


    private $originName;              //源文件名
    private $tmpFileName;              //临时文件名
    private $fileType;               //文件类型(文件后缀)
    private $fileSize;               //文件大小
    private $newFileName;              //新文件名
    private $errorNum = 0;             //错误号
    private $errorMess="";             //错误报告消息

    /**
     * 用于设置成员属性($path, $allowtype,$maxsize, $israndname)
     * 可以通过连贯操作一次设置多个属性值
     *@param  string $key  成员属性名(不区分大小写)
     *@param  mixed  $val  为成员属性设置的值
     *@return  object     返回自己对象$this,可以用于连贯操作
     */
    function set($key, $val){
      $key = strtolower($key); 
      if( array_key_exists( $key, get_class_vars(get_class($this) ) ) ){
        $this->setOption($key, $val);
      }
      return $this;
    }

    /**
     * 调用该方法上传文件
     * @param  string $fileFile  上传文件的表单名称 
     * @return bool        如果上传成功返回数 true 
     */

    function upload($fileField) {
      $return = true;
      /* 检查文件路径是滞合法 */
      if( !$this->checkFilePath() ) {       
        $this->errorMess = $this->getError();
        return false;
      }
      /* 将文件上传的信息取出赋给变量 */
      $name = $_FILES[$fileField]['name'];
      $tmp_name = $_FILES[$fileField]['tmp_name'];
      $size = $_FILES[$fileField]['size'];
      $error = $_FILES[$fileField]['error'];

      /* 如果是多个文件上传则$file["name"]会是一个数组 */
      if(is_Array($name)){    
        $errors=array();
        /*多个文件上传则循环处理 , 这个循环只有检查上传文件的作用,并没有真正上传 */
        for($i = 0; $i < count($name); $i++){ 
          /*设置文件信息 */
          if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i] )) {
            if(!$this->checkFileSize() || !$this->checkFileType()){
              $errors[] = $this->getError();
              $return=false; 
            }
          }else{
            $errors[] = $this->getError();
            $return=false;
          }
          /* 如果有问题,则重新初使化属性 */
          if(!$return)          
            $this->setFiles();
        }

        if($return){
          /* 存放所有上传后文件名的变量数组 */
          $fileNames = array();      
          /* 如果上传的多个文件都是合法的,则通过销魂循环向服务器上传文件 */
          for($i = 0; $i < count($name); $i++){ 
            if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i] )) {
              $this->setNewFileName(); 
              if(!$this->copyFile()){
                $errors[] = $this->getError();
                $return = false;
              }
              $fileNames[] = $this->newFileName;  
            }          
          }
          $this->newFileName = $fileNames;
        }
        $this->errorMess = $errors;
        return $return;
      /*上传单个文件处理方法*/
      } else {
        /* 设置文件信息 */
        if($this->setFiles($name,$tmp_name,$size,$error)) {
          /* 上传之前先检查一下大小和类型 */
          if($this->checkFileSize() && $this->checkFileType()){ 
            /* 为上传文件设置新文件名 */
            $this->setNewFileName(); 
            /* 上传文件  返回 0 为成功, 小于 0 都为错误 */
            if($this->copyFile()){ 
              return true;
            }else{
              $return=false;
            }
          }else{
            $return=false;
          }
        } else {
          $return=false; 
        }
        //如果$return 为 false, 则出错,将错误信息保存在属性 errorMess 中
        if(!$return)
          $this->errorMess=$this->getError();  

        return $return;
      }
    }

    /** 
     * 获取上传后的文件名称
     * @param  void   没有参数
     * @return string 上传后,新文件的名称, 如果是多文件上传返回数组
     */
    public function getFileName(){
      return $this->newFileName;
    }

    /**
     * 上传失败后,调用该方法则返回,上传出错信息
     * @param  void   没有参数
     * @return string  返回上传文件出错的信息报告,如果是多文件上传返回数组
     */
    public function getErrorMsg(){
      return $this->errorMess;
    }

    /* 设置上传出错信息 */
    private function getError() {
      $str = "上传文件<font color='red'>{$this->originName}</font>时出错 : ";
      switch ($this->errorNum) {
        case 4: $str .= "没有文件被上传"; break;
        case 3: $str .= "文件只有部分被上传"; break;
        case 2: $str .= "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值"; break;
        case 1: $str .= "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值"; break;
        case -1: $str .= "未允许类型"; break;
        case -2: $str .= "文件过大,上传的文件不能超过{$this->maxsize}个字节"; break;
        case -3: $str .= "上传失败"; break;
        case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
        case -5: $str .= "必须指定上传文件的路径"; break;
        default: $str .= "未知错误";
      }
      return $str.'<br>';
    }

    /* 设置和$_FILES 有关的内容 */
    private function setFiles($name="", $tmp_name="", $size=0, $error=0) {
      $this->setOption('errorNum', $error);
      if($error)
        return false;
      $this->setOption('originName', $name);
      $this->setOption('tmpFileName',$tmp_name);
      $aryStr = explode(".", $name);
      $this->setOption('fileType', strtolower($aryStr[count($aryStr)-1]));
      $this->setOption('fileSize', $size);
      return true;
    }

    /* 为单个成员属性设置值 */
    private function setOption($key, $val) {
      $this->$key = $val;
    }

    /* 设置上传后的文件名称 */
    private function setNewFileName() {
      if ($this->israndname) {
        $this->setOption('newFileName', $this->proRandName());  
      } else{ 
        $this->setOption('newFileName', $this->originName);
      } 
    }

    /* 检查上传的文件是否是合法的类型 */
    private function checkFileType() {
      if (in_array(strtolower($this->fileType), $this->allowtype)) {
        return true;
      }else {
        $this->setOption('errorNum', -1);
        return false;
      }
    }

    /* 检查上传的文件是否是允许的大小 */
    private function checkFileSize() {
      if ($this->fileSize > $this->maxsize) {
        $this->setOption('errorNum', -2);
        return false;
      }else{
        return true;
      }
    }

    /* 检查是否有存放上传文件的目录 */
    private function checkFilePath() {
      if(empty($this->path)){
        $this->setOption('errorNum', -5);
        return false;
      }
      if (!file_exists($this->path) || !is_writable($this->path)) {
        if (!@mkdir($this->path, 0755)) {
          $this->setOption('errorNum', -4);
          return false;
        }
      }
      return true;
    }

    /* 设置随机文件名 */
    private function proRandName() {    
      if($this->isshowfirm){
        $fileName = date('YmdHis')."_".rand(10000,99999)."_".$this->isshowfirm;    
      }else{
        $fileName = date('YmdHis')."_".rand(10000,99999);      
      }      
      return $fileName.'.'.$this->fileType; 
    }

    /* 复制上传文件到指定的位置 */
    private function copyFile() {
      if(!$this->errorNum) {
        $path = rtrim($this->path, '/').'/';
        $path .= $this->newFileName;
        if (@move_uploaded_file($this->tmpFileName, $path)) {
          return true;
        }else{
          $this->setOption('errorNum', -3);
          return false;
        }
      } else {
        return false;
      }
    }
  }

前端代码(使用基于 bootstrap 的 fileinput 上传插件):

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>退单</title>
<link rel="stylesheet" href="/css/bootstrap.css">
<link rel="stylesheet" href="/fileinput/css/fileinput.min.css">
<script src="/js/jquery.js"></script>
<!-- canvas-to-blob.min.js is only needed if you wish to resize images before upload.
     This must be loaded before fileinput.min.js -->
<script src="/fileinput/js/plugins/canvas-to-blob.min.js" ></script>
<script src="/fileinput/js/fileinput.min.js" ></script>
<!-- bootstrap.js below is only needed if you wish to the feature of viewing details
     of text file preview via modal dialog -->
<script src="/js/bootstrap.js"></script>
<!-- optionally if you need translation for your language then include 
    locale file as mentioned below -->
<script src="/fileinput/js/fileinput_locale_zh.js"></script>

<style>
#tddiv{margin-top: 30px;}
body{height: 600px;
    }


</style>
</head>
<body>     
  <div class="col-sm-12 column">
    <div class="col-sm-12">
      <span style="color:red"> 
        注:2016 年 3 月 1 日起申请退单必须上传相关录音或图片(二选一),成功上传并附带退单理由才可成功申请退单
      </span>
    </div>
    <div id="tddiv">
      <form class="form-horizontal" name="sub_td" role="form" action="/firms/sub_td" enctype="multipart/form-data" method="post" onsubmit="return dosubmit()"/> 
        <div class="form-group">
           <label for="inputPassword3" class="col-sm-2 control-label">退单理由:</label>
          <div class="col-sm-8">           
            <input id="td_ly" type="text" class="form-control"/>
          </div>          
        </div>           
        <div class="form-group">
           <label for="inputPassword3" class="col-sm-2 control-label">电话录音:</label>
          <div class="col-sm-10">           
           <input id="up_record" type="file" class="file" name="up_record[]" data-preview-file-type="text"/>
          </div>
        </div>         
        <div class="form-group">
           <label for="inputPassword3" class="col-sm-2 control-label">图片上传:</label>
          <div class="col-sm-10">
              <input id="up_image" type="file" class="file" name="up_image[]" data-preview-file-type="text" multiple/>
          </div>
        </div>                                       
        <div class="form-group">
          <div class="col-sm-offset-2 col-sm-2">            
            <input name="baoming_id" id="baoming_id" type="hidden" value="<?php echo $_GET['bm_id'];?>"/>
            <button type="submit" class="btn btn-success btn-block btn_sub" id="btn_sub" data-loading-text="请稍等..." autocomplete="off">提交</button>          
          </div>
<!--           <div class="col-sm-2">
             <button type="button" class="btn btn-default btn-block">取消</button>             
          </div>          --> 
        </div>            
      </form>
      </div>
  </div>
</body>
</html>


<script>
  //录音上传
  $('#up_record').fileinput({
      language: 'zh', //设置语言
      // uploadUrl: "/firms/sub_td", //上传的地址
      allowedFileExtensions : ['3gp','mp3','wav','au','aiff','amr','awb','aac','pps_amr'],//接收的文件后缀,
      maxFileCount: 1,
      enctype: 'multipart/form-data',
      showUpload:  false, //是否显示上传按钮
      showCaption: false,//是否显示标题
      browseClass: "btn btn-primary", //按钮样式             
      previewFileIcon: "<i class='glyphicon glyphicon-king'></i>", 
      msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
      uploadExtraData:{
        baoming_id: $("#baoming_id").val(),
      }
  });

  //图片上传
  $('#up_image').fileinput({
      language: 'zh', //设置语言
      // uploadUrl: "/firms/sub_td", //上传的地址
      allowedFileExtensions : ['jpg', 'png','gif'],//接收的文件后缀,
      maxFileCount: 3,
      enctype: 'multipart/form-data',
      showUpload:  false, //是否显示上传按钮
      showCaption: false,//是否显示标题
      browseClass: "btn btn-primary", //按钮样式             
      previewFileIcon: "<i class='glyphicon glyphicon-king'></i>", 
      msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
      uploadExtraData:{
        baoming_id: $("#baoming_id").val(),
      }      
  });

  function dosubmit(){
    $("#btn_sub").attr('disabled','disabled');
    $("#btn_sub").html('正在提交,请等待...');  
    return true;
  }

  //提交表单
  $("#btn_sub").on('click',function(){
    var td_liyou = $("#td_ly").val();
    if(td_liyou != null){            
      var trimtd_liyou = td_liyou.replace(/(^\s*)|(\s*$)/g, "");
      var ly_len = trimtd_liyou.length;
      if(ly_len<1){
          alert("对不起,退单理由不能为空");
          return false;
      }
    } else{
          return false;
    }    
    window.parent.settdly($("#baoming_id").val(),td_liyou);
  })

</script>

后端 php:

    /**
     * 退单保存
     * FileUpload
     **/
    public function sub_td(){
        $this->autoRender = false;
        $flag = false;
        $firm_sid   = $this->users['id'];//商家登录 ID
        $baoming_id = $_POST['baoming_id'];        
        if(empty($firm_sid) || empty($baoming_id)){
            echo json_encode(array('code'=> 403,'str' => '缺少参数!'));
            exit;
        }        
        $inf = $this->Baomings->getBaomings(array('firm_id'=>$firm_sid,'baoming_id'=> $baoming_id),'','Baomings.id desc',1);
        if(count($inf) == 0 || !is_array($inf)){
            echo json_encode(array('code'=> 403,'str' => '公司所对应的报名编号不存在!'));
            exit;
        }          

        if(!empty($_FILES['up_record'])){        
            # 实例化上传类(上传录音)
            $up = new FileUploadComponent;
            //设置属性(上传的位置, 大小, 类型, 名是是否要随机生成)
            $up -> set("path", "/data/NetImage/firms/tdupload/tape/");
            // $up -> set("path", "./tduploads/");
            $up -> set("maxsize", 10 * 1024 * 1024); # 10MB
            $up -> set("allowtype", array("3gp","mp3","wav","au","aiff","amr","awb","aac","pps_amr"));
            $up -> set("israndname", true); # 自动命名    
            $up -> set("isshowfirm", $firm_sid); # 拼接 firmid              
            if($up -> upload("up_record")) { # 录音上传成功
                //获取上传后文件名子
                $recorf   = $up->getFileName();
                $countr   = count($up->getFileName()); 
                $ftd_data = array();
                $ftd_data['firm_id']    = $firm_sid;
                $ftd_data['baoming_id'] = $baoming_id;
                $ftd_data['type']       = 0; # 类型录音
                $ftd_data['create_time'] = date("Y-m-d H:i:s");
                for ($i=0; $i <= $countr; $i++) { 
                   $ftd_data['src'] = $recorf[$i];
                   $resr = $this->FirmTdUpload->saveAll($ftd_data);    
                }
                $flag = true;

            } else {
                //获取上传失败以后的错误提示
                // var_dump($up->getErrorMsg());
                echo '没有上传录音';
            }
        } # 上传录音 end

        if(!empty($_FILES['up_image'])){        
            # 实例化上传类(上传图片)
            $upi = new FileUploadComponent;
            //设置属性(上传的位置, 大小, 类型, 名是是否要随机生成)
            $upi -> set("path", "/data/NetImage/firms/tdupload/image/");
            // $upi -> set("path", "./tduploads/");
            $upi -> set("maxsize", 10 * 1024 * 1024); # 10MB
            $upi -> set("allowtype", array("jpeg","gif","png","jpg"));
            $upi -> set("israndname", true); # 自动命名      
            $upi -> set("isshowfirm", $firm_sid); # 拼接 firmid
            if($upi -> upload("up_image")) { # 上传成功
                //获取上传后文件名子
                $recori   = $upi->getFileName();
                $counti   = count($upi->getFileName()); 
                $ftd_data = array();
                $ftd_data['firm_id']    = $firm_sid;
                $ftd_data['baoming_id'] = $baoming_id;
                $ftd_data['type']       = 1; # 类型图片
                $ftd_data['create_time'] = date("Y-m-d H:i:s");
                for ($i=0; $i <= $counti; $i++) { 
                   $ftd_data['src'] = $recori[$i];
                   $resi = $this->FirmTdUpload->saveAll($ftd_data);    
                }
                // echo json_encode(array('code'=> 200,'str' => '图片上传成功!', 'id' => $baoming_id));
                $flag = true;
            } else {
                //获取上传失败以后的错误提示
                // var_dump($upi->getErrorMsg());
                echo '没有上传图片!';
            }
        } #上传图片 end

        # 判断标记变量
        if($flag){
            echo '<script>window.parent.moniclick('.$baoming_id.');javascript:parent.jQuery.fancybox.close();</script>';
        }
    }

IT 乐园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:上传文件实例(后端 php)
喜欢 (0)
关于作者:
九零后挨踢男
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址