7天入门php-文件上传进度

获取文件上传进度的方法很多,该文介绍的是使用session.upload_progress,基于PHP 5.4以上版本的方法。

【1】文件php.ini 配置

根据实际情况进行设置

session.upload_progress.enabled[=1] : 是否启用上传进度报告(默认开启)
session.upload_progress.cleanup[=1] : 是否在上传完成后及时删除进度数据(默认开启, 推荐开启).
session.upload_progress.prefix[=upload_progress_] : 进度数据将存储在_SESSION[session.upload_progress.prefix . _POST[session.upload_progress.name]]
session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS] : 如果_POST[session.upload_progress.name]没有被设置, 则不会报告进度.
session.upload_progress.freq[=1%] : 更新进度的频率(已经处理的字节数), 也支持百分比表示’%’.
session.upload_progress.min_freq[=1.0] : 更新进度的时间间隔(秒级)


;允许客户端单个POST请求发送的最大数据 M
post_max_size=2048M

;接受所有数据到开始执行脚本的最大时间 S
max_input_time=60

;脚本的最大执行时间 S
max_execution_time=0

;是否开启文件上传功能
file_uploads = On

;文件上传的临时目录
upload_tmp_dir="C:\xampp\tmp"

;允许单个请求上传的最大文件大小 M
upload_max_filesize = 2048M

;允许单个POST请求同时上传的最大文件数量
max_file_uploads = 20

7天入门php-文件上传进度_第1张图片

7天入门php-文件上传进度_第2张图片


【2】 _FILES变量简介

[php]  view plain  copy
 print ?
  1. $_FILES["file"]["name"] - 被上传文件的名称  
  2. $_FILES["file"]["type"] - 被上传文件的类型  
  3. $_FILES["file"]["size"] - 被上传文件的大小,以字节计  
  4. $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称  
  5. $_FILES["file"]["error"] - 由文件上传导致的错误代码  


【3】代码

文件上传表单

      设置session.upload_progress.name key的值

[php]  view plain  copy
 print ?
  1. if (version_compare(phpversion(), '5.4.0''<'))  
  2.     exit('ERROR: Your PHP version is ' . phpversion() . ' but this script requires PHP 5.4.0 or higher.');  
  3.   
  4. if (!intval(ini_get('session.upload_progress.enabled')))  
  5.     exit('session.upload_progress.enabled is not enabled, please activate it in your PHP config file to use this script.');  
  6.   
  7. require_once ("upload.class.php");  
  8. ?>  
  9.   
  10.   
  11.   
  12.   
  13. "utf-8">  
  14.   
  15.   
  16. "upload-form" action="upload.php" method="POST" enctype="multipart/form-data">  
  17.    
  18.  "hidden"  
  19.   name="session.upload_progress.name"); ?>" value="" />  
  20.    
  21.  
  22.   
  23.  
  24.   
  25.  
  26.   
  27.  
  28.   
  29.  
  30. "file1[]" type="file" align="right"/> "submit" name="Submit" value="上传"/>
       
  31.   
  32.   
  33.   

文件上传处理类

[php]  view plain  copy
 print ?
  1. class CUpload  
  2. {  
  3.     const   UPLOAD_PROGRESS_PREFIX = 'progress_bar';  
  4.     private $_sMsg,  $_sUploadDir,  $_sProgressKey;  
  5.   
  6.     // The short array syntax (only for PHP 5.4.0 and higher)  
  7.     private $_aErrFile = [  
  8.          UPLOAD_ERR_OK         => 'There is no error, the file uploaded with success.',  
  9.          UPLOAD_ERR_INI_SIZE   => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',  
  10.          UPLOAD_ERR_FORM_SIZE  => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',  
  11.          UPLOAD_ERR_PARTIAL    => 'The uploaded file was only partially uploaded.',  
  12.          UPLOAD_ERR_NO_FILE    => 'No file was uploaded.',  
  13.          UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder.',  
  14.          UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.',  
  15.          UPLOAD_ERR_EXTENSION  => 'A PHP extension stopped the file upload.'  
  16.     ];  
  17.   
  18.     public function __construct()  
  19.     {  
  20.         // Session initialization  
  21.         if ('' === session_id()) session_start();  
  22.   
  23.         $this->_sUploadDir = 'uploads/';  
  24.         $this->_sProgressKey = strtolower(ini_get('session.upload_progress.prefix') . static::UPLOAD_PROGRESS_PREFIX);  
  25.     }     
  26.       
  27.     public function __destruct()  
  28.     {  
  29.         if ('' !== session_id())  
  30.         {  
  31.             $_SESSION = array();     
  32.             session_destroy();  
  33.         }  
  34.     }  
  35.   
  36.     /** 
  37.      * @return object this 
  38.      */  
  39.     public function addFile()  
  40.     {  
  41.         if(!empty($_FILES))  
  42.         {  
  43.             $this->_sMsg = '';  
  44.   
  45.             foreach($_FILES as $sKey => $aFiles)  
  46.             {  
  47.                 for($i = 0, $iNumFiles = count($aFiles['tmp_name']); $i < $iNumFiles$i++)  
  48.                 {  
  49.                     /** 
  50.                      * 获取上传文件的参数 
  51.                      */  
  52.                     $iErrCode   = $aFiles['error'][$i];  
  53.                     $iSize      = $aFiles['size'][$i];  
  54.                     $sFileName  = $aFiles['name'][$i];  
  55.                     $sTmpFile   = $aFiles['tmp_name'][$i];  
  56.                     $sFileDest  = $this->_sUploadDir . $sFileName;  
  57.                     $sTypeFile  = $aFiles['type'][$i];  
  58.   
  59.                     /** 
  60.                      * 检测文件类型 
  61.                      */  
  62.                     //$bIsImgExt = (strtolower(substr(strrchr($sFileName, '.'), 1))); // Get the file extension  
  63.                     //if(($bIsImgExt == 'jpeg' || $bIsImgExt == 'jpg' || $bIsImgExt == 'png' || $bIsImgExt == 'gif') && (strstr($sTypeFile, '/', true) === 'image'))  
  64.                     {  
  65.                         if($iErrCode == UPLOAD_ERR_OK)  
  66.                         {  
  67.                             move_uploaded_file($sTmpFile$sFileDest);  
  68.                               
  69.                             $this->_sMsg .= 'Successful "' . $sFileName . '" file upload!

    '
    ;  
  70.                             $this->_sMsg .= 'Image type: ' . str_replace('image/'''$sTypeFile) . '';  
  71.                             $this->_sMsg .= 'Size: ' . round($iSize / 1024) . ' KB';  
  72.                             $this->_sMsg .= ' . $sFileDest . '" title="Click here to see the original file" target="_blank"> . $sFileDest . '" alt="' . $sFileName  . '" width="300" height="250" style="border:1.5px solid #ccc; border-radius:5px" />

    '
    ;  
  73.                         }  
  74.                         else  
  75.                         {  
  76.                             $this->_sMsg .= 'Error while downloading the file "' . $sFileName . '"';  
  77.                             $this->_sMsg .= 'Error code: "' . $iErrCode . '"';  
  78.                             $this->_sMsg .= 'Error message: "' . $this->_aErrFile[$iErrCode] . '"

    '
    ;  
  79.                         }  
  80.                     }  
  81.                     //else  
  82.                     {  
  83.                     //    $this->_sMsg .= 'File type incompatible. Please save the image in .jpg, .jpeg, .png or .gif

    ';
      
  84.                     }  
  85.                 }  
  86.             }  
  87.         }  
  88.         else  
  89.         {  
  90.             $this->_sMsg = 'You must select at least one file before submitting the form.

    '
    ;  
  91.         }  
  92.   
  93.         return $this;  
  94.     }     
  95.   
  96.     /** 
  97.      * 中断文件上传 
  98.      * 
  99.      * @return object this 
  100.      */  
  101.     public function cancel()  
  102.     {  
  103.         if (!empty($_SESSION[$this->_sProgressKey]))  
  104.             $_SESSION[$this->_sProgressKey]['cancel_upload'] = true;  
  105.   
  106.         return $this;  
  107.     }  
  108.       
  109.      /** 
  110.      * @return 上传进度 
  111.      */  
  112.     public function progress()  
  113.     {  
  114.         if(!empty($_SESSION[$this->_sProgressKey]))  
  115.         {  
  116.             $aData = $_SESSION[$this->_sProgressKey];  
  117.             $iProcessed = $aData['bytes_processed'];  
  118.             $iLength    = $aData['content_length'];  
  119.             $iProgress  = ceil(100*$iProcessed / $iLength);  
  120.         }  
  121.         else  
  122.         {  
  123.             $iProgress = 100;  
  124.         }  
  125.   
  126.         return $iProgress;  
  127.     }  
  128.       
  129.      /** 
  130.      * @return object this 
  131.      */  
  132.      public function show()  
  133.      {  
  134.          ob_start();  
  135.          echo '

    $_FILES Result:

    ';  
  136.          var_dump($_FILES);  
  137.          echo '';  
  138.          echo '

    $_SESSION Result:

    ';  
  139.          var_dump($_SESSION);  
  140.          echo '';  
  141.          $this->_sMsg = ob_get_clean();  
  142.   
  143.          return $this;  
  144.      }  
  145.   
  146.     /** 
  147.      * Get the JSON informational message. 
  148.      * 
  149.      * @param integer $iStatus, 1 = success, 0 = error 
  150.      * @param string $sTxt 
  151.      * @return string JSON Format. 
  152.      */  
  153.      public static function jsonMsg($iStatus$sTxt)  
  154.      {  
  155.          return '{"status":' . $iStatus . ',"txt":"' . $sTxt . '"}';  
  156.      }  
  157.   
  158.     /** 
  159.      * Get the informational message. 
  160.      * 
  161.      * @return string 
  162.      */  
  163.     public function __toString()  
  164.     {  
  165.         return $this->_sMsg;  
  166.     }  
  167. }  

执行文件上传操作

[php]  view plain  copy
 print ?
  1. require_once ("upload.class.php");  
  2. $upload = new CUpload;  
  3. $upload->addFile();  
  4.   
  5. echo $upload;  
  6. /*$_SESSION["upload_progress_testUpload"] = array( 
  7.  "start_time" => 1234567890,   // 请求时间 
  8.  "content_length" => 57343257, // 上传文件总大小 
  9.  "bytes_processed" => 453489,  // 已经处理的大小 
  10.  "done" => false,              // 当所有上传处理完成后为TRUE 
  11.  "files" => array( 
  12.   0 => array( 
  13.    "field_name" => "file1",       // 表单中上传框的名字 
  14.    // The following 3 elements equals those in $_FILES 
  15.    "name" => "foo.avi", 
  16.    "tmp_name" => "/tmp/phpxxxxxx", 
  17.    "error" => 0, 
  18.    "done" => true,                // 当这个文件处理完成后会变成TRUE 
  19.    "start_time" => 1234567890,    // 这个文件开始处理时间 
  20.    "bytes_processed" => 57343250, // 这个文件已经处理的大小 
  21.   ), 
  22.   // An other file, not finished uploading, in the same request 
  23.   1 => array( 
  24.    "field_name" => "file2", 
  25.    "name" => "bar.avi", 
  26.    "tmp_name" => NULL, 
  27.    "error" => 0, 
  28.    "done" => false, 
  29.    "start_time" => 1234567899, 
  30.    "bytes_processed" => 54554, 
  31.   ), 
  32.  ) 
  33. );*/  
  34. ?>  
获取文件上传进度

[php]  view plain  copy
 print ?
  1. session_start();  
  2.   
  3. require_once ("upload.class.php");  
  4. echo (new CUpload())->progress();  
  5. ?>  


UI使用一些插件上传文件,就可以获取上传进度,不用这么麻烦


你可能感兴趣的:(PHP)