濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解

PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解

熱門標(biāo)簽:外呼系統(tǒng)撥打暫時(shí)無法接通 仁和怎么申請(qǐng)400開頭的電話 廣東地市地圖標(biāo)注 江西手機(jī)自動(dòng)外呼防封系統(tǒng)是什么 長(zhǎng)春人工外呼系統(tǒng)服務(wù)商 怎么向銷售公司推銷外呼系統(tǒng) 高德地圖標(biāo)注家 哪里辦理400電話 廣州防封卡外呼系統(tǒng)多少錢一個(gè)月

本文實(shí)例講述了PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能。分享給大家供大家參考,具體如下:

介紹

session.upload_progress 是PHP5.4的新特征。

當(dāng) session.upload_progress.enabled INI 選項(xiàng)開啟時(shí),PHP 能夠在每一個(gè)文件上傳時(shí)監(jiān)測(cè)上傳進(jìn)度。 這個(gè)信息對(duì)上傳請(qǐng)求自身并沒有什么幫助,但在文件上傳時(shí)應(yīng)用可以發(fā)送一個(gè)POST請(qǐng)求到終端(例如通過XHR)來檢查這個(gè)狀態(tài)。

當(dāng)一個(gè)上傳在處理中,同時(shí)POST一個(gè)與INI中設(shè)置的session.upload_progress.name同名變量時(shí),上傳進(jìn)度可以在$_SESSION中獲得。 當(dāng)PHP檢測(cè)到這種POST請(qǐng)求時(shí),它會(huì)在$_SESSION中添加一組數(shù)據(jù), 索引是session.upload_progress.prefix與 session.upload_progress.name連接在一起的值。

開啟session.upload_progress

修改php.ini文件,開啟session.upload_progress的支持。

session.upload_progress.enabled = On
session.upload_progress.cleanup = On
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq = "1%"
session.upload_progress.min_freq = "1"

對(duì)于PHP語言,這應(yīng)該是最好的解決方案了,因?yàn)檫@種方式依賴于PHP內(nèi)部的session機(jī)制,開始上傳文件創(chuàng)建相關(guān)session以便讀取,文件上傳完成就會(huì)銷毀session。html5的文件上傳api也可以顯示上傳進(jìn)度,但是對(duì)IE的10以下的版本沒法使用,所以兼容性不太好。

接下來,我們通過一個(gè)例子,實(shí)現(xiàn)以下相關(guān)效果。

修改php上傳文件限制

php.ini默認(rèn)的上傳文件大小上限為2M,然而我們既然需要顯示文件上傳進(jìn)度,肯定都是要能夠上傳比較大的文件。尤其我們?cè)诒镜胤?wù)器上測(cè)試的時(shí)候,因?yàn)榉?wù)器保存的路徑是在本地磁盤上,所以文件上傳就相當(dāng)于在磁盤上復(fù)制,速度很快,我們想要比較直觀的看到上傳進(jìn)度的顯示,就需要上傳一個(gè)比較大的文件,我在測(cè)試的時(shí)候,上傳的是一個(gè)400多M的壓縮包。

可以通過下面的php.ini的配置,調(diào)整上傳文件大小的限制(以上限500M為例)

upload_max_filesize = 500M; //上傳文件的最大值,還可以調(diào)更大
post_max_size = 500M;    //post方式傳遞過來數(shù)據(jù)最大值,還可以調(diào)更大
max_execution_time = 1800; //頁面最大執(zhí)行時(shí)間,已經(jīng)設(shè)置為最大值
max_input_time = 1800; //解析傳入數(shù)據(jù)最大執(zhí)行時(shí)間,已經(jīng)設(shè)置為最大值
memory_limit = 128M;  //每個(gè)頁面消耗的最大內(nèi)存,已經(jīng)設(shè)置為最大值

實(shí)例程序

首先放上最簡(jiǎn)單的部分,上傳文件轉(zhuǎn)存程序

upload.php

?php
if(isset($_FILES['demo'])){
  $tmp=explode(".",$_FILES['demo']['name']);
  $suffix_name = end($tmp);
  $name = time().".".$suffix_name;
  $path = __DIR__."\\".$name;
  move_uploaded_file($_FILES['demo']['tmp_name'],$path);
  echo "upload success";
}else{
  echo "error";
}

然后是前臺(tái)獲取上傳文件百分?jǐn)?shù)的接口文件

progress.php

?php
session_start();
$key = ini_get("session.upload_progress.prefix") . $_GET["key"];
if (!empty($_SESSION[$key])) {
  $current = $_SESSION[$key]["bytes_processed"];
  $total = $_SESSION[$key]["content_length"];
  echo $current  $total ? ceil($current / $total * 100) : 100;
}else{
  echo 100;
}

最后是前臺(tái)的上傳文件界面

index.html

!DOCTYPE html>
html lang="en">
head>
  meta charset="UTF-8">
  title>上傳文件示例程序/title>
/head>
body>
div id="fileUpload">
  form id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" target="hidden_iframe">
    p>
      input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="file1" />
      input type="file" name="demo">
      input type="submit" value="上傳">
    /p>
  /form>
/div>
iframe name="hidden_iframe" src="about:blank" style="display:none;">/iframe>
div id="process">
  上傳進(jìn)度:span id="percent">/span>
/div>
/body>
script src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min.js">/script>
script>
  function fetch_progress(){
    $.get('progress.php',{"key":"file1"}, function(data){
      document.getElementById("percent").innerText = data+"%";
      if(data == 100){
        return;
      }else{
        setTimeout(fetch_progress,100);
      }
    });
  }
  $('#upload-form').submit(function(){
    setTimeout(fetch_progress,100);
  });
/script>
/html>

在前臺(tái)頁面,通過form的target屬性,將提交之后的頁面指向了該頁的iframe,避免了頁面的跳轉(zhuǎn)。

總結(jié)

php.ini默認(rèn)配置的上傳文件大小是2M,我們上傳文件通常是需要修改一下配置文件使用的。

從php5.4開始,通過php.ini配置session.upload_progress之后,文件上傳時(shí),就會(huì)創(chuàng)建key為session.upload_progress.prefix+session.upload_progress.name的session。其中session.upload_progress.prefix是配置文件中定義的,session.upload_progress.name需要在form表單提交時(shí),一并提交才可以。

文件開始上傳,創(chuàng)建session,上傳過程中,session文件中保存了以上傳字節(jié)數(shù)和總字節(jié)數(shù),可以以及計(jì)算得到上傳文件百分比,在上傳完成之后,該session會(huì)被銷毀。

bootstrap樣式的進(jìn)度條

index.html加上bootstrap的進(jìn)度條樣式,頓時(shí)高大上多了,哈哈

!DOCTYPE html>
html lang="en">
head>
  meta charset="UTF-8">
  title>上傳文件示例程序/title>
  link rel="stylesheet"  rel="external nofollow" >
  script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js">/script>
  script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js">/script>
/head>
body>
div style="width: 400px;margin-top: 30px;margin-left: 30px;">
  div id="fileUpload">
    form class="form-horizontal" role="form" id="upload-form" action="upload.php" method="post" enctype="multipart/form-data" target="hidden_iframe">
      input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="file1" />
      div class="form-group">
        div class="col-sm-8" style="margin-top: 7px;">
          input type="file" name="demo" >
        /div>
        div class="col-sm-4">
          button type="submit" class="btn btn-primary btn-sm">上傳文件/button>
        /div>
      /div>
    /form>
  /div>
  iframe name="hidden_iframe" src="about:blank" style="display:none;">/iframe>
  div class="progress" style="display: none;">
    div id="percent" class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width:0%;">
      0%
    /div>
  /div>
/div>
/body>
script>
  function fetch_progress(){
    $.get('progress.php',{"key":"file1"}, function(data){
      document.getElementById("percent").innerText = data+"%";
      document.getElementById("percent").setAttribute("style","width:"+data+"%;");
      document.getElementsByClassName("progress")[0].setAttribute("style","display: block;");
      if(data == 100){
        return;
      }else{
        setTimeout(fetch_progress,100);
      }
    });
  }
  $('#upload-form').submit(function(){
    setTimeout(fetch_progress,100);
  });
/script>
/html>

顯示效果

參考文檔:

http://php.net/manual/zh/session.upload-progress.php
//www.jb51.net/article/56305.htm

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP錯(cuò)誤與異常處理方法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP7創(chuàng)建銷毀session的實(shí)例方法
  • PHP 圖像處理與SESSION制作超簡(jiǎn)單驗(yàn)證碼的方法示例
  • PHP 實(shí)現(xiàn)超簡(jiǎn)單的SESSION與COOKIE登錄驗(yàn)證功能示例
  • PHP cookie與session會(huì)話基本用法實(shí)例分析
  • 如何解決PHP獲取不到SESSION信息之一般情況
  • thinkphp 5框架實(shí)現(xiàn)登陸,登出及session登陸狀態(tài)檢測(cè)功能示例
  • PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法詳解
  • 通過代碼實(shí)例解析PHP session工作原理

標(biāo)簽:湘西 廈門 黔東 梅河口 濮陽 海北 惠州 文山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解》,本文關(guān)鍵詞  PHP,基于,session.upload,progress,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    广丰县| 青海省| 崇阳县| 始兴县| 河津市| 肃南| 和田市| 深圳市| 新巴尔虎左旗| 龙陵县| 桑日县| 乳山市| 易门县| 宁城县| 枣庄市| 光泽县| 九江市| 鹤山市| 博爱县| 永顺县| 枣庄市| 织金县| 大名县| 漠河县| 四平市| 遂川县| 阜城县| 宾阳县| 吴桥县| 苏州市| 嫩江县| 镶黄旗| 荃湾区| 威信县| 肇东市| 陕西省| 南充市| 安岳县| 瓦房店市| 白河县| 宁远县|