亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > PHP使用Session實現上傳進度功能詳解

PHP使用Session實現上傳進度功能詳解

熱門標簽:高德地圖標注家 長春人工外呼系統服務商 哪里辦理400電話 廣東地市地圖標注 怎么向銷售公司推銷外呼系統 仁和怎么申請400開頭的電話 江西手機自動外呼防封系統是什么 外呼系統撥打暫時無法接通 廣州防封卡外呼系統多少錢一個月

本文實例講述了PHP使用Session實現上傳進度功能。分享給大家供大家參考,具體如下:

實現文件上傳進度條基本是依靠JS插件或HTML5的File API來完成,其實PHP配合ajax也能實現此功能。

PHP手冊對于session上傳進度是這么介紹的:

session.upload_progress.enabled INI 選項開啟時,PHP 能夠在每一個文件上傳時監測上傳進度。 這個信息對上傳請求自身并沒有什么幫助,但在文件上傳時應用可以發送一個POST請求到終端(例如通過XHR)來檢查這個狀態

當一個上傳在處理中,同時POST一個與INI中設置的session.upload_progress.name同名變量時,上傳進度可以在$_SESSION中獲得。 當PHP檢測到這種POST請求時,它會在$_SESSION中添加一組數據, 索引是 session.upload_progress.prefixsession.upload_progress.name連接在一起的值。 通常這些鍵值可以通過讀取INI設置來獲得,例如

?php
$key = ini_get("session.upload_progress.prefix") . ini_get("session.upload-progress.name");
var_dump($_SESSION[$key]);
?>

通過將$_SESSION[$key]["cancel_upload"]設置為TRUE,還可以取消一個正在處理中的文件上傳。 當在同一個請求中上傳多個文件,它僅會取消當前正在處理的文件上傳和未處理的文件上傳,但是不會移除那些已經完成的上傳。 當一個上傳請求被這么取消時,$_FILES中的error將會被設置為 UPLOAD_ERR_EXTENSION

session.upload_progress.freqsession.upload_progress.min_freq INI選項控制了上傳進度信息應該多久被重新計算一次。 通過合理設置這兩個選項的值,這個功能的開銷幾乎可以忽略不計。

注意:為了使這個正常工作,web服務器的請求緩沖區需要禁用,否則 PHP可能僅當文件完全上傳完成時才能收到文件上傳請求。 已知會緩沖這種大請求的程序有Nginx。

下面原理介紹:

  當瀏覽器向服務器端上傳一個文件時,PHP將會把此次文件上傳的詳細信息(如上傳時間、上傳進度等)存儲在session當中。然后,隨著上傳的進行,周期性的更新session中的信息。這樣,瀏覽器端就可以使用Ajax周期性的請求一個服務器端腳本,由該腳本返回session中的進度信息;瀏覽器端的Javascript即可根據這些信息顯示/更新進度條了。

php.ini需配置以下選項

session.upload_progress.enabled = "1"
session.upload_progress.cleanup = "1"
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"

  其中enabled控制upload_progress功能的開啟與否,默認開啟;
  cleanup 則設置當文件上傳的請求提交完成后,是否清除session的相關信息,默認開啟,如果需要調試$_SESSION,則應該設為Off。
  prefix 和 name 兩項用來設置進度信息在session中存儲的變量名/鍵名。
  freq 和 min_freq 兩項用來設置服務器端對進度信息的更新頻率。合理的設置這兩項可以減輕服務器的負擔。
  在上傳文件的表單中,需要為該次上傳設置一個標識符,并在接下來的過程中使用該標識符來引用進度信息。

  具體的,在上傳表單中需要有一個隱藏的input,它的name屬性為php.ini中 session.upload_progress.name 的值;它的值為一個由你自己定義的標識符。如下:
 代碼如下:

input type="hidden" name="?php echo ini_get('session.upload_progress.name'); ?>" value="test" />

接到文件上傳的表單后,PHP會在$_SESSION變量中新建鍵,鍵名是一個將session.upload_progress.prefix的值與上面自定義的標識符連接后得到的字符串,可以這樣得到:

代碼如下:

$name = ini_get('session.upload_progress.name');
$key = ini_get('session.upload_progress.prefix') . $_POST[$name];
$_SESSION[$key]; // 這里就是此次文件上傳的進度信息了
$_SESSION[$key]這個變量的結構是這樣的:

array (
  'upload_progress_test' => array (
    'start_time' => 1491494993,  // 開始時間
    'content_length' => 1410397, // POST請求的總數據長度
    'bytes_processed' => 1410397, // 已收到的數據長度
    'done' => true,        // 請求是否完成 true表示完成,false未完成
    'files' => array (
      0 => array (
        'field_name' => 'file1',
        'name' => 'test.jpg',
        'tmp_name' => 'D:\\wamp\\tmp\\phpE181.tmp',
        'error' => 0,
        'done' => true,
        'start_time' => 1491494993,
        'bytes_processed' => 1410096,
      ),
    ),
  ),
);

這樣,我們就可以使用其中的 content_length bytes_processed 兩項來得到進度百分比。

原理介紹完了,下面我們來完整的實現一個基于PHP和Javascript的文件上傳進度條。

上傳表單index.php

?php session_start(); ?>
!DOCTYPE html>
html lang="zh-CN">
head>
  meta charset="utf-8">
  title>PHP(5.4) Session 上傳進度 Demo/title>
  meta name="viewport" content="width=device-width, initial-scale=1.0">
  meta name="keywords" content=""/>
  meta name="description" content=""/>
  meta name="author" content="">
  link  rel="external nofollow" rel="stylesheet">
  style type="text/css">
    body{
      font-size:1em;
      color:#333;
      font-family: "宋體", Arial, sans-serif;
    }
    h1, h2, h3, h4, h5, h6{
      font-family: "宋體", Georgia, serif;
      color:#000;
      line-height:1.8em;
      margin:0;
    }
    h1{ font-size:1.8em; }
    #wrap{
      margin-top:15px;
      margin-bottom:50px;
      background:#fff;
      border-radius:5px;
      box-shadow:inset 0 0 3px #000,
      0 0 3px #eee;
    }
    #header{
      border-radius:5px 5px 0 0;
      box-shadow:inset 0 0 3px #000;
      padding:0 15px;
      color:#fff;
      background: #333333;
    }
    #header h1{
      color:#fff;
    }
    #article{
      padding:0 15px;
    }
    #footer{
      text-align:center;
      border-top:1px solid #ccc;
      border-radius:0 0 5px 5px;
    }
    .progress {
      width: 100%;
      border: 1px solid #4da8fe;
      border-radius: 40px;
      height: 20px;
      position: relative;
    }
    .progress .labels {
      position: relative;
      text-align: center;
    }
    .progress .bar {
      position: absolute;
      left: 0;
      top: 0;
      background: #4D90FE;
      height: 20px;
      line-height:20px;
      border-radius: 40px;
      min-width: 20px;
    }
    .report-file {
      display: block;
      position: relative;
      width: 120px;
      height: 28px;
      overflow: hidden;
      border: 1px solid #428bca;
      background: none repeat scroll 0 0 #428bca;
      color: #fff;
      cursor: pointer;
      text-align: center;
      float: left;
      margin-right:5px;
    }
    .report-file span {
      cursor: pointer;
      display: block;
      line-height: 28px;
    }
    .file-prew {
      cursor: pointer;
      position: absolute;
      top: 0;
      left:0;
      width: 120px;
      height: 30px;
      font-size: 100px;
      opacity: 0;
      filter: alpha(opacity=0);
    }
    .container{
      padding-left:0;
      padding-right:0;
      margin:0 auto;
    }
  /style>
/head>
body>
div id="wrap" class="container">
  div id="header">
    h1>Session上傳進度 Demo/h1>
  /div>
  div id="article">
    form id="upload-form" action="upload.php" method="POST" enctype="multipart/form-data" style="margin:15px 0"
       target="hidden_iframe">
      input type="hidden" name="?php echo ini_get("session.upload_progress.name"); ?>" value="test"/>
      div class="report-file">
        span>上傳文件…/span>input tabindex="3" size="3" name="file1" class="file-prew" type="file" onchange="document.getElementById('textName').value=this.value">
      /div>
      input type="text" id="textName" style="height: 28px;border:1px solid #f1f1f1" />
      p>
        input type="submit" class="btn btn-default" value="上傳"/>
      /p>
    /form>
    div id="progress" class="progress" style="margin-bottom:15px;display:none;">
      div class="bar" style="width:0%;">/div>
      div class="labels">0%/div>
    /div>
  /div> !-- #article -->
  div id="footer">
    p> /p>
  /div>
/div>!-- #wrap -->
iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;">/iframe>
script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js">/script>
script type="text/javascript">
  function fetch_progress() {
    $.get('progress.php', {'?php echo ini_get("session.upload_progress.name"); ?>': 'test'}, function (data) {
      var progress = parseInt(data);
      $('#progress .labels').html(progress + '%');
      $('#progress .bar').css('width', progress + '%');
      if (progress  100) {
        setTimeout('fetch_progress()', 500);
      } else {
        $('#progress .labels').html('100%');
      }
    }, 'html');
  }
  $('#upload-form').submit(function () {
    $('#progress').show();
    //圖片比較小,看不出進度條加載效果,初始設33%
    $('#progress .labels').html('33%');
    $('#progress .bar').css('width', '33%');
    setTimeout('fetch_progress()', 500);
  });
/script>
/body>
/html>

  注意表單中的session.upload_progress.name隱藏項,值設置為了test。表單中僅有一個文件上傳input,如果需要,你可以添加多個。
  這里需要特別注意一下表單的target屬性,這里設置指向了一個當前頁面中的iframe。這一點很關鍵,通過設置target屬性,讓表單提交后的頁面顯示在iframe中,從而避免當前的頁面跳轉。因為我們還得在當前頁面顯示進度條呢。

上傳文件upload.php

?php
/**
 * 上傳文件
 */
if(is_uploaded_file($_FILES['file1']['tmp_name'])){
  //unlink($_FILES['file1']['tmp_name']);
  $fileName = 'pic_' . date('YmdHis') . mt_rand(10000,99999);
  $ext = substr($_FILES['file1']['name'], strrpos($_FILES['file1']['name'], '.'));
  move_uploaded_file($_FILES['file1']['tmp_name'], $fileName . $ext);
}

ajax獲取上傳進度progress.php

?php
/**
 * AJAX獲取上傳文件進度
 */
session_start();
$i = ini_get('session.upload_progress.name');
//session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
$key = ini_get("session.upload_progress.prefix") . $_GET[$i];
//session.upload_progress.prefix = "upload_progress_" . 'test'
if (!empty($_SESSION[$key])) {
  $current = $_SESSION[$key]["bytes_processed"]; // 已收到的數據長度
  $total  = $_SESSION[$key]["content_length"]; // POST請求的總數據長度
  echo $current  $total ? ceil($current / $total * 100) : 100;
}else{
  echo 100;
}

注意事項:

1.input標簽的位置name為session.upload_progress.name的input標簽一定要放在文件input input type="file" /> 的前面。

2.通過設置 $_SESSION[$key]['cancel_upload'] = true 可取消當次上傳。但僅能取消正在上傳的文件和尚未開始的文件。已經上傳成功的文件不會被刪除。

3.應該通過 setTimeout() 來調用 fetch_progress(),這樣可以確保一次請求返回之后才開始下一次請求。如果使用 setInterval() 則不能保證這一點,有可能導致進度條出現'不進反退'。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php文件操作總結》、《PHP目錄操作技巧匯總》、《PHP常用遍歷算法與技巧總結》、《PHP數據結構與算法教程》、《php程序設計算法總結》及《PHP網絡編程技巧總結》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • php7 list()、session及其他模塊的修改實例分析
  • PHP7創建銷毀session的實例方法
  • PHP 圖像處理與SESSION制作超簡單驗證碼的方法示例
  • PHP 實現超簡單的SESSION與COOKIE登錄驗證功能示例
  • PHP cookie與session會話基本用法實例分析
  • 如何解決PHP獲取不到SESSION信息之一般情況
  • thinkphp 5框架實現登陸,登出及session登陸狀態檢測功能示例
  • php實現多站點共用session實現單點登錄的方法詳解
  • PHP實現cookie跨域session共享的方法分析
  • PHP SESSION跨頁面傳遞失敗解決方案

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

巨人網絡通訊聲明:本文標題《PHP使用Session實現上傳進度功能詳解》,本文關鍵詞  PHP,使用,Session,實現,上傳,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP使用Session實現上傳進度功能詳解》相關的同類信息!
  • 本頁收集關于PHP使用Session實現上傳進度功能詳解的相關信息資訊供網民參考!
  • 推薦文章
    99久久精品国产高清一区二区| 午夜欧美福利| 精品久久久久久综合网 | 一级毛片视频免费| 欧美另类videosbestsex久久| 国产成人女人在线视频观看| 一级女人毛片人一女人| 台湾毛片| 久久久久久久网| 精品国产亚洲一区二区三区| 午夜在线亚洲| 欧美激情一区二区三区视频| 青青久久精品国产免费看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本特黄一级| 久草免费在线视频| 沈樵在线观看福利| 日韩免费在线视频| 久久国产精品自线拍免费| 国产成人精品在线| 亚洲天堂免费| 国产国语对白一级毛片| 欧美电影免费| 天天做日日爱夜夜爽| 精品国产一区二区三区久久久狼| 国产网站免费| 日韩在线观看视频免费| 久久精品免视看国产成人2021| 日日日夜夜操| 亚洲第一色在线| 青青久在线视频| 四虎影视精品永久免费网站| 国产成人欧美一区二区三区的| 免费的黄视频| 欧美激情一区二区三区中文字幕| 国产极品白嫩美女在线观看看| 国产成人精品在线| 高清一级片| 精品视频免费看| 色综合久久天天综合| 日韩中文字幕一区二区不卡| 色综合久久天天综合| 欧美日本韩国| 国产视频一区二区在线播放| 国产精品免费久久| 精品国产香蕉在线播出| 国产91素人搭讪系列天堂| 日韩在线观看免费完整版视频| 国产精品自拍在线观看| 成人在激情在线视频| 日韩专区在线播放| 可以在线看黄的网站| 国产91素人搭讪系列天堂| 99久久精品国产高清一区二区| 欧美电影免费看大全| 99热热久久| 亚洲第一视频在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产精品1024永久免费视频| 亚欧成人乱码一区二区| 亚洲第一页乱| 国产精品1024永久免费视频| 国产网站免费在线观看| 国产网站在线| 一级女人毛片人一女人| 日日夜夜婷婷| 天天做人人爱夜夜爽2020| 国产麻豆精品hdvideoss| 可以免费看毛片的网站| 久久国产影视免费精品| 欧美国产日韩在线| 黄视频网站免费看| 国产一级强片在线观看| 可以免费看毛片的网站| 麻豆系列 在线视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩免费在线视频| 91麻豆爱豆果冻天美星空| 可以免费看污视频的网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 二级片在线观看| 精品视频在线观看一区二区| 欧美大片aaaa一级毛片| 亚洲 男人 天堂| 你懂的福利视频| 日本免费看视频| 香蕉视频久久| 国产成人啪精品视频免费软件| 美女免费黄网站| 亚洲天堂在线播放| 国产网站免费视频| 日本伦理片网站| 国产不卡精品一区二区三区| 999久久久免费精品国产牛牛| 午夜在线观看视频免费 成人| 日日日夜夜操| 日日日夜夜操| 台湾毛片| 九九久久国产精品| 尤物视频网站在线观看| 国产激情视频在线观看| 成人在激情在线视频| 你懂的日韩| 99久久精品国产高清一区二区 | 你懂的在线观看视频| 九九精品在线| 韩国三级香港三级日本三级la| 国产美女在线观看| 国产国语对白一级毛片| 国产原创视频在线| 欧美a免费| 99色视频在线观看| 成人免费观看视频| 国产网站麻豆精品视频| 国产国语在线播放视频| 欧美激情在线精品video| 你懂的在线观看视频| 国产麻豆精品hdvideoss| 久久精品店| 日韩男人天堂| 国产网站免费视频| 久久成人亚洲| 国产国语在线播放视频| 99久久网站| 999久久66久6只有精品| 欧美一级视| 美国一区二区三区| 国产精品自拍亚洲| 欧美国产日韩久久久| 国产不卡在线看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 九九免费高清在线观看视频| 可以免费看毛片的网站| 日韩男人天堂| 黄色免费三级| 国产精品自拍在线| 亚洲 激情| 亚欧乱色一区二区三区| 国产网站麻豆精品视频| 欧美日本二区| 亚洲 国产精品 日韩| 国产韩国精品一区二区三区| 国产精品自拍在线| 91麻豆高清国产在线播放| 中文字幕一区二区三区精彩视频 | 黄色免费三级| 中文字幕一区二区三区 精品| 亚欧乱色一区二区三区| 久久国产精品自由自在| 成人影院久久久久久影院| 国产a免费观看| 免费的黄色小视频| 久久成人亚洲| 日本特黄特色aa大片免费| 成人免费观看男女羞羞视频 | 青青青草视频在线观看| 午夜在线影院| 二级特黄绝大片免费视频大片| 日本特黄特黄aaaaa大片| 欧美一级视频免费观看| 欧美激情中文字幕一区二区| 久久久久久久网| 国产网站免费在线观看| 色综合久久天天综合| 国产亚洲精品成人a在线| 国产韩国精品一区二区三区| 高清一级毛片一本到免费观看| 日韩中文字幕在线播放| 美女被草网站| 四虎影视精品永久免费网站| 免费毛片播放| 日本免费乱理伦片在线观看2018| 黄视频网站在线免费观看| 美女免费精品高清毛片在线视| 久久福利影视| 午夜精品国产自在现线拍| 四虎影视库| 精品国产一区二区三区久久久蜜臀| 国产精品1024永久免费视频 | 亚飞与亚基在线观看| 久久精品人人做人人爽97| 久久福利影视| 色综合久久手机在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产不卡在线看| 色综合久久天天综合绕观看| 精品在线视频播放| 韩国毛片基地| 国产精品1024永久免费视频| 日本特黄一级| 麻豆网站在线免费观看| 午夜在线观看视频免费 成人| 国产一区国产二区国产三区| 国产一区二区精品久久91| 欧美日本二区| 精品国产一区二区三区久久久狼| 欧美a免费| 久草免费在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 高清一级毛片一本到免费观看|