PHP配合apc實現上傳進度條, 一直以為PHP是無法做到進度條一個動態的功能,原來還是自己的知識面不夠,看到了apc擴展相關的一些文章,利用apc擴展達到了動態實現效果。根據找到相關的文章自己并在此基礎上做了一些小修改。自己的服務器用的window,在這里主要針對的是window上的應用。
1.服務器要支持apc擴展,沒有此擴展的話,百度一下php_apc.dll ,下載一個擴展擴展要求php.5.2以上。
2.配置apc相關配置,重啟apache
PHP Code
extension=php_apc.dll  
apc.rfc1867 = on  
apc.max_file_size = 1000M  
upload_max_filesize = 1000M  
post_max_size = 1000M  
 
說明一下:至于參數要配多大,得看項目需要apc.max_file_size,  設置apc所支持上傳文件的大小,要求apc.max_file_size <=upload_max_filesize  并且apc.max_file_size <=post_max_size.重新啟動apache即可實現apc的支持.
3.在代碼里面利用phpinfo();查看apc擴展安裝了沒有。
4.下面是實現代碼:
getprogress.php
PHP Code
<?php  
session_start();  
if(isset($_GET['progress_key'])) {  
  $status = apc_fetch('upload_'.$_GET['progress_key']);  
  echo ($status['current']/$status['total'])*100;  
}  
?>  
upload.php
PHP Code
<?php  
   $id = $_GET['id'];  
?>  
<form enctype="multipart/form-data" id="upload_form" action="target.php" method="POST">  
<input type="hidden" name="APC_UPLOAD_PROGRESS"   
       id="progress_key"  value="<?php echo $id?>"/>  
<input type="file" id="test_file" name="test_file"/><br/>  
<input onclick="window.parent.startProgress(); return true;"  
 type="submit" value="上傳"/>  
</form> 
target.php
PHP Code
<?php    
set_time_limit(600);  
if($_SERVER['REQUEST_METHOD']=='POST') {  
  move_uploaded_file($_FILES["test_file"]["tmp_name"],   
  dirname($_SERVER['SCRIPT_FILENAME'])."/UploadTemp/" . $_FILES["test_file"]["name"]);//UploadTemp文件夾位于此腳本相同目錄下  
  echo "<p>上傳成功</p>";  
}  
?>  
index.php
PHP Code
<?php  
   $id = md5(uniqid(rand(), true));  
?>  
<html>  
<head><title>上傳進度</title></head>  
<body>  
<script src="js/jquery-1.4.4.min.js" language="javascript"></script>  
  
  
<script language="javascript">  
var proNum=0;  
var loop=0;  
var progressResult;  
function sendURL() {  
            $.ajax({  
                        type : 'GET',  
                        url : "getprogress.php?progress_key=<?php echo $id;?>",  
                        async : true,  
                        cache : false,  
                        dataType : 'json',  
                        data: "progress_key=<?php echo $id;?>",  
                        success : function(e) {  
                                     progressResult = e;  
                                      proNum=parseInt(progressResult);  
                                      document.getElementById("progressinner").style.width = proNum+"%";  
                                      document.getElementById("showNum").innerHTML = proNum+"%";  
                                      if ( proNum < 100){  
                                        setTimeout("getProgress()", 100);  
                                      }   
                                   
                        }  
            });  
    
}  
  
function getProgress(){  
 loop++;  
  
 sendURL();  
}  
var interval;  
function startProgress(){  
    document.getElementById("progressouter").style.display="block";  
   setTimeout("getProgress()", 100);  
}  
</script>  
<iframe id="theframe" name="theframe"   
        src="upload.php?id=<?php echo $id; ?>"   
        style="border: none; height: 100px; width: 400px;" >   
</iframe>  
<br/><br/>  
<div id="progressouter" style="width: 500px; height: 20px; border: 6px solid red; display:none;">  
   <div id="progressinner" style="position: relative; height: 20px; background-color: purple; width: 0%; "></div>  
</div>  
<div id='showNum'></div><br>  
<div id='showNum2'></div>  
</body>  
</html> 
地 址:北京市海淀區建材城中路12號院17號樓1層119室
		
武漢分公司地址:湖北省武漢市洪山區南國雄楚廣場A4棟2011室
		
鄭州分公司地址:河南鄭州金水區東風路科技市場對面米蘭陽光6號樓917室
郵 箱:haidanet@163.com
24小時聯系電話: 15201609116    13651084380