PHP基于session.upload_progress 實現(xiàn)文件上傳進度顯示功能詳解
本文實例講述了PHP基于session.upload_progress 實現(xiàn)文件上傳進度顯示功能。分享給大家供大家參考,具體如下:
介紹
session.upload_progress 是PHP5.4的新特征。
當 session.upload_progress.enabled INI 選項開啟時,PHP 能夠在每一個文件上傳時監(jiān)測上傳進度。 這個信息對上傳請求自身并沒有什么幫助,但在文件上傳時應用可以發(fā)送一個POST請求到終端(例如通過XHR)來檢查這個狀態(tài)。
當一個上傳在處理中,同時POST一個與INI中設置的session.upload_progress.name同名變量時,上傳進度可以在$_SESSION中獲得。 當PHP檢測到這種POST請求時,它會在$_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"
對于PHP語言,這應該是最好的解決方案了,因為這種方式依賴于PHP內(nèi)部的session機制,開始上傳文件創(chuàng)建相關session以便讀取,文件上傳完成就會銷毀session。html5的文件上傳api也可以顯示上傳進度,但是對IE的10以下的版本沒法使用,所以兼容性不太好。
接下來,我們通過一個例子,實現(xiàn)以下相關效果。
修改php上傳文件限制
php.ini默認的上傳文件大小上限為2M,然而我們既然需要顯示文件上傳進度,肯定都是要能夠上傳比較大的文件。尤其我們在本地服務器上測試的時候,因為服務器保存的路徑是在本地磁盤上,所以文件上傳就相當于在磁盤上復制,速度很快,我們想要比較直觀的看到上傳進度的顯示,就需要上傳一個比較大的文件,我在測試的時候,上傳的是一個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í)行時間,已經(jīng)設置為最大值 max_input_time = 1800; //解析傳入數(shù)據(jù)最大執(zhí)行時間,已經(jīng)設置為最大值 memory_limit = 128M; //每個頁面消耗的最大內(nèi)存,已經(jīng)設置為最大值
實例程序
首先放上最簡單的部分,上傳文件轉(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";
}
然后是前臺獲取上傳文件百分數(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;
}
最后是前臺的上傳文件界面
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">
上傳進度:<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>
在前臺頁面,通過form的target屬性,將提交之后的頁面指向了該頁的iframe,避免了頁面的跳轉(zhuǎn)。
總結(jié)
php.ini默認配置的上傳文件大小是2M,我們上傳文件通常是需要修改一下配置文件使用的。
從php5.4開始,通過php.ini配置session.upload_progress之后,文件上傳時,就會創(chuàng)建key為session.upload_progress.prefix+session.upload_progress.name的session。其中session.upload_progress.prefix是配置文件中定義的,session.upload_progress.name需要在form表單提交時,一并提交才可以。
文件開始上傳,創(chuàng)建session,上傳過程中,session文件中保存了以上傳字節(jié)數(shù)和總字節(jié)數(shù),可以以及計算得到上傳文件百分比,在上傳完成之后,該session會被銷毀。
bootstrap樣式的進度條
index.html加上bootstrap的進度條樣式,頓時高大上多了,哈哈
<!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.dbjr.com.cn/article/56305.htm
更多關于PHP相關內(nèi)容感興趣的讀者可查看本站專題:《php緩存技術總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP錯誤與異常處理方法總結(jié)》、《php面向?qū)ο蟪绦蛟O計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
相關文章
php模擬asp中的XmlHttpRequest實現(xiàn)http請求的代碼
為了自己方便模擬asp里面的xmlhttp組件寫的phphttp請求類,基本的功能都實現(xiàn)了,支持gzip壓縮2011-03-03
從0構(gòu)建Oauth2Server服務?之Token?編解碼
這篇文章主要為大家介紹了從0構(gòu)建Oauth2Server服務之Token編解碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05

