国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

PHP 文件上傳進(jìn)度條實(shí)現(xiàn)程序

2024-05-04 21:48:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在php中要實(shí)現(xiàn)上傳進(jìn)度條有很多方法,如ajax是現(xiàn)在的主流或利用iframe來(lái)實(shí)現(xiàn),現(xiàn)在我們來(lái)介紹php的apc與uploadprogress實(shí)現(xiàn)文件上傳進(jìn)度條效果.

目前我知道的方法有兩種,一種是使用PHP的創(chuàng)始人 Rasmus Lerdorf 寫(xiě)的APC擴(kuò)展模塊來(lái)實(shí)現(xiàn)(http://pecl.php.net/package/apc),另外一種方法是使用PECL擴(kuò)展模塊 uploadprogress實(shí)現(xiàn)(http://pecl.php.net/package/uploadprogress)我這里舉兩個(gè)分別實(shí)現(xiàn)的例子供參考,更靈活的應(yīng)用根據(jù)自己需要來(lái)修改.

APC實(shí)現(xiàn)方法:

安裝APC,參照官方文檔安裝,可以使用PECL模塊安裝方法快速簡(jiǎn)捷,這里不說(shuō)明配置php.ini,設(shè)置參數(shù) apc.rfc1867=1,使APC支持上傳進(jìn)度條功能,在APC源碼說(shuō)明文檔里面有說(shuō)明.

代碼范例,代碼如下:

  1. if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上傳請(qǐng)求 
  2.     $status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']); 
  3.     $status['done'] = 1; 
  4.     echo json_encode($status);  //輸出給用戶端頁(yè)面里的ajax調(diào)用,相關(guān)文檔請(qǐng)自己尋找 
  5.     exit
  6. elseif (isset($_GET['progress_key'])) {   //讀取上傳進(jìn)度 
  7.     $status = apc_fetch('upload_'.$_GET['progress_key']); 
  8.     echo json_encode($status); 
  9.     exit
  10. else { 
  11.     //其他代碼,比如上傳表單等 

uploadprogress 模塊實(shí)現(xiàn)方法,使用PECL模塊安裝方法安裝該模塊,php.ini里面設(shè)置 uploadprogress.file.filename_template = “/tmp/upd_%s.txt”.

代碼范例,代碼如下:

  1. if($_SERVER['REQUEST_METHOD']=='POST') { 
  2.     if (is_uploaded_file($_FILES['upfile']['tmp_name'])) { 
  3.         $upload_dir = 'your_path/'
  4.         $ext        = strrchr($_FILES['video']['name'], '.'); 
  5.         $sessid     = $_POST['UPLOAD_IDENTIFIER'] ; 
  6.         $tmpfile    = $upload_dir . $sessid;   
  7.         $sessfile   = $upload_dir . $sessid .$ext
  8.         if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) { 
  9.             //上傳成功 
  10.         } else { 
  11.             //上傳失敗 
  12.     } else { 
  13.         //上傳錯(cuò)誤 
  14.          
  15. elseif (!emptyempty($_GET['sessid'])) { 
  16.     header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
  17.     header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
  18.     header("Cache-Control: no-store, no-cache, must-revalidate"); 
  19.     header("Cache-Control: post-check=0, pre-check=0", false); 
  20.     header("Pragma: no-cache"); 
  21.     header("Content-Type:text/html;charset=UTF-8"); 
  22.  
  23.     $unique_id = $_GET['sessid']; 
  24.     $uploadvalues = uploadprogress_get_info($unique_id); 
  25.  
  26.     if (is_array($uploadvalues)) { 
  27.         echo json_encode($uploadvalues); 
  28.     } else { 
  29.         //讀取進(jìn)度失敗,另外處理邏輯 
  30.     } 
  31.      
  32. else { 
  33.     //顯示上傳表單 

整合,現(xiàn)在剩下的只是要把所有內(nèi)容 hook 到一起,您可以通過(guò) progress.php 頁(yè)面來(lái)完成此操作.

清單 5,最終的 progress.php 頁(yè)面,代碼如下:

  1. <?php 
  2.    $id = uniqid(""); 
  3. ?> 
  4. <html> 
  5. <head><title>Upload Example</title></head> 
  6. <body> 
  7.  
  8. <script src="http://maps.google.com/maps?file=api&v=2&key=<yourkeyhere>" 
  9.             type="text/javascript"></script> 
  10.  
  11. <script type="text/javascript"
  12.  
  13. function getProgress(){ 
  14.   GDownloadUrl("getprogress.php?progress_key=<?php echo($id)?>",  
  15.                function(percent, responseCode) { 
  16.                    document.getElementById("progressinner").style.width = percent+"%"
  17.                    if (percent < 100){ 
  18.                         setTimeout("getProgress()", 100); 
  19.                    } 
  20.                }); 
  21.  
  22.  
  23. function startProgress(){ 
  24.     document.getElementById("progressouter").style.display="block"
  25.     setTimeout("getProgress()", 1000); 
  26.  
  27. </script> 
  28.  
  29. <iframe id="theframe" name="theframe"  
  30.         src="upload.php?id=<?php echo($id) ?>"  
  31.         style="border: none; height: 100px; width: 400px;" >  
  32. </iframe>//開(kāi)源代碼Vevb.com 
  33. <br/><br/> 
  34.  
  35. <div id="progressouter" style= 
  36.    "width: 500px; height: 20px; border: 6px solid red; display:none;"
  37.    <div id="progressinner" style= 
  38.        "position: relative; height: 20px; background-color: purple; width: 0%; "
  39.    </div> 
  40. </div> 
  41.  
  42. </body> 
  43. </html> 

從底層開(kāi)始向上層工作,我們已經(jīng)添加了嵌入清單 1 中的 upload.php 腳本的 iframe,給它提供了在頁(yè)面頂部生成的惟一 ID,現(xiàn)在,是否還記得該表單中的 Submit 按鈕?代碼如下:

<input onclick="window.parent.startProgress(); return true;" type="submit" value="Upload!"/>

該按鈕將完成兩項(xiàng)工作,提交表單,像普通的 Submit 按鈕一樣,但在執(zhí)行該操作之前,它將在主窗口中調(diào)用 startProgress() 腳本,startProgress() 腳本將告訴進(jìn)度條顯示自身 —— 開(kāi)始時(shí)無(wú)顯示屬性,然后告訴瀏覽器等待一秒,然后再執(zhí)行 getProgress() 腳本.

現(xiàn)在,getProgress() 腳本將使事情變得有趣,記不記得在前面我說(shuō)過(guò)將需要使用 Ajax 或某種類似的方法來(lái)檢查文件的進(jìn)度?對(duì),在本例中,表單將采用捷徑,調(diào)用來(lái)自 Google Maps API 庫(kù)的 GdownloadUrl() 函數(shù),注意,表單將導(dǎo)入位于頁(yè)面頂部的庫(kù),您將需要獲得自己的訪問(wèn)此庫(kù)的密鑰,但是它是從 Google 免費(fèi)獲取的.

此函數(shù)將下載 URL 的內(nèi)容 —— 本例中為 getprogress.php 腳本 —— 并執(zhí)行在其中定義的匿名函數(shù),函數(shù)所接受的第一個(gè)參數(shù)是從 URL 返回的數(shù)據(jù),本例中為百分比,以便使用它更新進(jìn)度條,最后,如果文件尚未完成下載,則告訴瀏覽器每十分之一秒重試一次,在實(shí)際情況中,可能無(wú)法那么快地執(zhí)行這些調(diào)用,但是瀏覽器將盡其所能進(jìn)行操作.

最終結(jié)果是頁(yè)面使用戶可以查看文件正被上傳的進(jìn)度.

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

PHP限制上傳文件大小第一,在php.ini里面查看如下行:

  1. upload_max_filesize = 8M 
  2.  
  3. post_max_size = 10M 
  4.  
  5. memory_limit = 20M 

把這些值改成我所說(shuō)的,看看有沒(méi)有問(wèn)題,另外要確認(rèn)上傳的 <form> 里沒(méi)有類似下面的這行:<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限制上傳文件大小之后,文件上傳就不會(huì)出現(xiàn)如上問(wèn)題,上傳不響應(yīng),上傳現(xiàn)實(shí)該頁(yè)無(wú)法現(xiàn)實(shí)也將得到解決.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北票市| 罗城| 舞钢市| 会宁县| 蕉岭县| 万山特区| 吴旗县| 家居| 连云港市| 肃北| 广平县| 阜宁县| 兰西县| 新民市| 古交市| 安新县| 阿鲁科尔沁旗| 开鲁县| 星座| 会宁县| 沙湾县| 楚雄市| 巴彦县| 剑阁县| 嘉黎县| 耒阳市| 剑川县| 门源| 当雄县| 精河县| 东丽区| 莱州市| 蒲江县| 南澳县| 顺昌县| 邢台市| 石家庄市| 马鞍山市| 慈溪市| 调兵山市| 江口县|