zoukankan      html  css  js  c++  java
  • php 文件上传,下载

    文件下载:

    html:

    <html>
    <body>
      <a href="1.rar">下载1.rar</a>
      <br />
      <a href="1.jpg">下载1.jpg</a> <!--会显示文件内容,而不是下载-->
      <br />
      <a href="doDownload.php?filename=1.jpg">通过程序下载1.jpg</a>
      <br />
      <a href="doDownload.php?filename=../upload/nv.jpg">下载nv.jpg</a>
    </body>
    </html>
    

    php处理:

    <?php 
    $filename=$_GET['filename'];
    //设置下载文件名
    header('content-disposition:attachment;filename='.basename($filename));
    header('content-length:'.filesize($filename));
    readfile($filename);

    文件上传:

    html代码:

    <html>
    <body>
      <form action="doAction5.php" method="post" enctype="multipart/form-data">
        请选择您要上传的文件:<input type="file" name='myFile1' /><br/>
        请选择您要上传的文件:<input type="file" name='myFile2' /><br/>
        请选择您要上传的文件:<input type="file" name='myFile[]' /><br/>
        请选择您要上传的文件:<input type="file" name='myFile[]' /><br/>
        请选择您要上传的文件:<input type="file" name='myFile[]' multiple="multiple" /><br/>
        <input type="submit" value="上传文件" />
      </form>
    </body>
    </html>
    

    php代码:

    <?php 
    /**
     * 得到文件扩展名
     * @param string $filename
     * @return string
     */
    function getExt($filename){
      return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
    }
    
    /**
     * 产生唯一字符串
     * @return string
     */
    function getUniName(){
      return md5(uniqid(microtime(true),true));
    }

    upload.func1.php

    <?php 
    
    /**
     * 构建上传文件信息
     * @return unknown
     */
    function getFiles(){
      $i=0;
      foreach($_FILES as $file){
        if(is_string($file['name'])){
          $files[$i]=$file;
          $i++;
        }elseif(is_array($file['name'])){
          foreach($file['name'] as $key=>$val){
            $files[$i]['name']=$file['name'][$key];
            $files[$i]['type']=$file['type'][$key];
            $files[$i]['tmp_name']=$file['tmp_name'][$key];
            $files[$i]['error']=$file['error'][$key];
            $files[$i]['size']=$file['size'][$key];
            $i++;
          }
        }
      }
      return $files;
      
    }
    /**
     * 针对于单文件、多个单文件、多文件的上传
     * @param array $fileInfo
     * @param string $path
     * @param string $flag
     * @param number $maxSize
     * @param array $allowExt
     * @return string
     */
    function uploadFile($fileInfo,$path='./uploads',$flag=true,$maxSize=1048576,$allowExt=array('jpeg','jpg','png','gif')){
      //$flag=true;
      //$allowExt=array('jpeg','jpg','gif','png');
      //$maxSize=1048576;//1M
      //判断错误号
      if($fileInfo['error']===UPLOAD_ERR_OK){
        //检测上传得到小
        if($fileInfo['size']>$maxSize){
          $res['mes']=$fileInfo['name'].'上传文件过大';
        }
        $ext=getExt($fileInfo['name']);
        //检测上传文件的文件类型
        if(!in_array($ext,$allowExt)){
          $res['mes']=$fileInfo['name'].'非法文件类型';
        }
        //检测是否是真实的图片类型
        if($flag){
          if(!getimagesize($fileInfo['tmp_name'])){
            $res['mes']=$fileInfo['name'].'不是真实图片类型';
          }
        }
        //检测文件是否是通过HTTP POST上传上来的
        if(!is_uploaded_file($fileInfo['tmp_name'])){
          $res['mes']=$fileInfo['name'].'文件不是通过HTTP POST方式上传上来的';
        }
        if($res) return $res;
        //$path='./uploads';
        if(!file_exists($path)){
          mkdir($path,0777,true);
          chmod($path,0777);
        }
        $uniName=getUniName();
        $destination=$path.'/'.$uniName.'.'.$ext;
        if(!move_uploaded_file($fileInfo['tmp_name'],$destination)){
          $res['mes']=$fileInfo['name'].'文件移动失败';
        }
        $res['mes']=$fileInfo['name'].'上传成功';
        $res['dest']=$destination;
        return $res;
        
      }else{
        //匹配错误信息
        switch ($fileInfo ['error']) {
          case 1 :
            $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
            break;
          case 2 :
            $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';
            break;
          case 3 :
            $res['mes'] = '文件部分被上传';
            break;
          case 4 :
            $res['mes'] = '没有选择上传文件';
            break;
          case 6 :
            $res['mes'] = '没有找到临时目录';
            break;
          case 7 :
          case 8 :
            $res['mes'] = '系统错误';
            break;
        }
        return $res;
      }
    }

    doAction5.php

    <?php 
    //print_r($_FILES);
    header("content-type:text/html;charset=utf-8");
    require_once 'upload.func1.php';
    require_once 'common.func.php';
    $files=getFiles();
    // print_r($files);
    foreach($files as $fileInfo){
      $res=uploadFile($fileInfo);
      echo $res['mes'],'<br/>';
      $uploadFiles[]=$res['dest'];
    }
    $uploadFiles=array_values(array_filter($uploadFiles));
    print_r($uploadFiles);

    上面是通过函数实现,下载封装成为类:

    html:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
    <form action="doAction6.php" method="post" enctype="multipart/form-data">
        请选择您要上传的文件:<input type="file" name='myFile1' />
        <input type="submit" value="上传文件" />
    </form>
    </body>
    </html>

    upload.class.php

    <?php 
    class upload{
      protected $fileName;
      protected $maxSize;
      protected $allowMime;
      protected $allowExt;
      protected $uploadPath;
      protected $imgFlag;
      protected $fileInfo;
      protected $error;
      protected $ext;
      /**
       * @param string $fileName
       * @param string $uploadPath
       * @param string $imgFlag
       * @param number $maxSize
       * @param array $allowExt
       * @param array $allowMime
       */
      public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){
        $this->fileName=$fileName;
        $this->maxSize=$maxSize;
        $this->allowMime=$allowMime;
        $this->allowExt=$allowExt;
        $this->uploadPath=$uploadPath;
        $this->imgFlag=$imgFlag;
        $this->fileInfo=$_FILES[$this->fileName];
      }
      /**
       * 检测上传文件是否出错
       * @return boolean
       */
      protected function checkError(){
        if(!is_null($this->fileInfo)){
          if($this->fileInfo['error']>0){
            switch($this->fileInfo['error']){
              case 1:
                $this->error='超过了PHP配置文件中upload_max_filesize选项的值';
                break;
              case 2:
                $this->error='超过了表单中MAX_FILE_SIZE设置的值';
                break;
              case 3:
                $this->error='文件部分被上传';
                break;
              case 4:
                $this->error='没有选择上传文件';
                break;
              case 6:
                $this->error='没有找到临时目录';
                break;
              case 7:
                $this->error='文件不可写';
                break;
              case 8:
                $this->error='由于PHP的扩展程序中断文件上传';
                break;
                
            }
            return false;
          }else{
            return true;
          }
        }else{
          $this->error='文件上传出错';
          return false;
        }
      }
      /**
       * 检测上传文件的大小
       * @return boolean
       */
      protected function checkSize(){
        if($this->fileInfo['size']>$this->maxSize){
          $this->error='上传文件过大';
          return false;
        }
        return true;
      }
      /**
       * 检测扩展名
       * @return boolean
       */
      protected function checkExt(){
        $this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));
        if(!in_array($this->ext,$this->allowExt)){
          $this->error='不允许的扩展名';
          return false;
        }
        return true;
      }
      /**
       * 检测文件的类型
       * @return boolean
       */
      protected function checkMime(){
        if(!in_array($this->fileInfo['type'],$this->allowMime)){
          $this->error='不允许的文件类型';
          return false;
        }
        return true;
      }
      /**
       * 检测是否是真实图片
       * @return boolean
       */
      protected function checkTrueImg(){
        if($this->imgFlag){
          if(!@getimagesize($this->fileInfo['tmp_name'])){
            $this->error='不是真实图片';
            return false;
          }
          return true;
        }
      }
      /**
       * 检测是否通过HTTP POST方式上传上来的
       * @return boolean
       */
      protected function checkHTTPPost(){
        if(!is_uploaded_file($this->fileInfo['tmp_name'])){
          $this->error='文件不是通过HTTP POST方式上传上来的';
          return false;
        }
        return true;
      }
      /**
       *显示错误 
       */
      protected function showError(){
        exit('<span style="color:red">'.$this->error.'</span>');
      }
      /**
       * 检测目录不存在则创建
       */
      protected function checkUploadPath(){
        if(!file_exists($this->uploadPath)){
          mkdir($this->uploadPath,0777,true);
        }
      }
      /**
       * 产生唯一字符串
       * @return string
       */
      protected function getUniName(){
        return md5(uniqid(microtime(true),true));
      }
    /**
       * 上传文件
       * @return string
       */
    public function uploadFile(){
    if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){
      $this->checkUploadPath();
      $this->uniName=$this->getUniName();
      $this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;
    if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){
    return  $this->destination;
      }else{
      $this->error='文件移动失败';
      $this->showError();
      }
      }else{
      $this->showError();
      }
      }
    }

    doAction6.php

    <?php 
    header('content-type:text/html;charset=utf-8');
    require_once 'upload.class.php';
    $upload=new upload('myFile1','imooc');
    $dest=$upload->uploadFile();
    echo $dest;
  • 相关阅读:
    poj 2112
    写给学大计python的同学的查错方法
    [Win32 API学习] Edit,ListBox的用法,字体的设置
    [Win32 API] FindFirstFile()和FindNextFile()
    初探C++ win32 api——Hello world!
    [学习笔记]舞蹈链(DLX)(C++指针版)
    2020科大回归记
    SCOI2019AFO记
    [学习笔记]动态动态规划/动态DP/DDP
    BZOJ5343[CTSC2018]混合果汁(二分答案+主席树)
  • 原文地址:https://www.cnblogs.com/saryli/p/4328953.html
Copyright © 2011-2022 走看看