程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 文件上傳進度條實現程序

PHP 文件上傳進度條實現程序

編輯:關於PHP編程

在php中要實現上傳進度條有很多方法,如ajax是現在的主流或利用iframe來實現,現在我們來介紹php的apc與uploadprogress實現文件上傳進度條效果。

 

目前我知道的方法有兩種,一種是使用PHP的創始人 Rasmus Lerdorf 寫的APC擴展模塊來實現(http://pecl.php.net/package/apc),另外一種方法是使用PECL擴展模塊 uploadprogress實現(http://pecl.php.net/package/uploadprogress)我這裡舉兩個分別實現的例子供參考,更靈活的應用根據自己需要來修改。

 
APC實現方法:
 
安裝APC,參照官方文檔安裝,可以使用PECL模塊安裝方法快速簡捷,這裡不說明
配置php.ini,設置參數 apc.rfc1867=1 ,使APC支持上傳進度條功能,在APC源碼說明文檔裡面有說明
代碼范例:
 

 代碼如下 復制代碼 if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上傳請求
    $status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
    $status['done'] = 1;
    echo json_encode($status);  //輸出給用戶端頁面裡的ajax調用,相關文檔請自己尋找
    exit;
} elseif (isset($_GET['progress_key'])) {   //讀取上傳進度
    $status = apc_fetch('upload_'.$_GET['progress_key']);
    echo json_encode($status);
    exit;
} else {
    //其他代碼,比如上傳表單等
}

uploadprogress 模塊實現方法:
使用PECL模塊安裝方法安裝該模塊
php.ini裡面設置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”

代碼范例:

 代碼如下 復制代碼

if($_SERVER['REQUEST_METHOD']=='POST') {
    if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {
        $upload_dir = 'your_path/';
        $ext        = strrchr($_FILES['video']['name'], '.');
        $sessid     = $_POST['UPLOAD_IDENTIFIER'] ;
        $tmpfile    = $upload_dir . $sessid; 
        $sessfile   = $upload_dir . $sessid .$ext;
        if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {
            //上傳成功
        } else {
            //上傳失敗
    } else {
        //上傳錯誤
       
} elseif (!empty($_GET['sessid'])) {
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-Type:text/html;charset=UTF-8");
 
    $unique_id = $_GET['sessid'];
    $uploadvalues = uploadprogress_get_info($unique_id);
 
    if (is_array($uploadvalues)) {
        echo json_encode($uploadvalues);
    } else {
        //讀取進度失敗,另外處理邏輯
    }
   
} else {
    //顯示上傳表單
}


整合

現在剩下的只是要把所有內容 hook 到一起。您可以通過 progress.php 頁面來完成此操作。


清單 5. 最終的 progress.php 頁面
               

 代碼如下 復制代碼

<?php
   $id = uniqid("");
?>
<html>
<head><title>Upload Example</title></head>
<body>

<script src="http://maps.google.com/maps?file=api&v=2&key=<yourkeyhere>"
            type="text/javascript"></script>

<script type="text/javascript">

function getProgress(){
  GDownloadUrl("getprogress.php?progress_key=<?php echo($id)?>",
               function(percent, responseCode) {
                   document.getElementById("progressinner").style.width = percent+"%";
                   if (percent < 100){
                        setTimeout("getProgress()", 100);
                   }
               });

}

function startProgress(){
    document.getElementById("progressouter").style.display="block";
    setTimeout("getProgress()", 1000);
}

</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>

</body>
</html>

 


從底層開始向上層工作,我們已經添加了嵌入清單 1 中的 upload.php 腳本的 iframe,給它提供了在頁面頂部生成的惟一 ID。

現在,是否還記得該表單中的 Submit 按鈕?

 代碼如下 復制代碼 <input onclick="window.parent.startProgress(); return true;"
 type="submit" value="Upload!"/>

 


該按鈕將完成兩項工作。提交表單,像普通的 Submit 按鈕一樣;但在執行該操作之前,它將在主窗口中調用 startProgress() 腳本。startProgress() 腳本將告訴進度條顯示自身 —— 開始時無顯示屬性,然後告訴浏覽器等待一秒,然後再執行 getProgress() 腳本。

現在,getProgress() 腳本將使事情變得有趣。記不記得在前面我說過將需要使用 Ajax 或某種類似的方法來檢查文件的進度?對,在本例中,表單將采用捷徑,調用來自 Google Maps API 庫的 GdownloadUrl() 函數(注意,表單將導入位於頁面頂部的庫。您將需要獲得自己的訪問此庫的密鑰,但是它是從 Google 免費獲取的)。

此函數將下載 URL 的內容 —— 本例中為 getprogress.php 腳本 —— 並執行在其中定義的匿名函數。函數所接受的第一個參數是從 URL 返回的數據,本例中為百分比,以便使用它更新進度條。最後,如果文件尚未完成下載,則告訴浏覽器每十分之一秒重試一次(在實際情況中,可能無法那麼快地執行這些調用,但是浏覽器將盡其所能進行操作)。

最終結果是頁面使用戶可以查看文件正被上傳的進度。


如果文件太大了我們可以如下操作:

PHP限制上傳文件大小第一:

在php.ini裡面查看如下行:

upload_max_filesize = 8M

post_max_size = 10M

memory_limit = 20M

把這些值改成我所說的,看看有沒有問題,另外要確認上傳的 <form> 裡沒有類似下面的這行

<input type="hidden" name="MAX_FILE_SIZE" value="500000">這樣也是限制上傳大小用的。

PHP限制上傳文件大小第二:

如果是apache 2 需要修改

/etc/httpd/conf.d/php.conf

中的LimitRequestBody 524288將524288(=512×1024)改大,比如5M(=5×1024×1024)

在PHP限制上傳文件大小之後,文件上傳就不會出現如上問題,上傳不響應,上傳現實該頁無法現實也將得到解決!

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved