2013-05-09 21 views
0

我在使用buildroot嵌入式linux上的FastCGI運行lighttpd + PHP 5.4。 我前段時間寫了一個修改後的PHP文件上傳進度腳本,使用以下教程:http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ 我以前使用mod_php在Slackware Apache上工作,一切正常。基於會話不工作的PHP + Javascript上傳

不幸的是,該腳本無法正常工作。我已經確保在php.ini session.upload_progress = On和會話已啓用。我已經通過使用兩個簡單的PHP文件來驗證會話是否正常工作,如4.在這裏發帖http://quirm.net/forum/topic.php?id=3950

該腳本應該顯示加載屏幕和文件上傳的百分比。它通過每0.2秒發送progress.php請求來實現。不幸的是,無論文件有多大(我使用〜13 MB文件進行測試,我已確保php.ini中的文件上傳大小接受此大小)上傳在第一次請求後結束,因爲它返回100.我有debbuged進度.php,它看起來整個$ _SESSION變量是空的。

這裏是我的HTML表單代碼:

<form enctype="multipart/form-data" action="actions/upload_upgrade.php" method="post" target="hidden_iframe" onsubmit="upload_type='config'; startUpload('config_form')" id="config_form"> 
       <p class="stdtext"> 
       Select File: 
       <input type="hidden" name="type" value="config"> 
       <input type="hidden" value="config_form" 
       name="<?php echo ini_get("session.upload_progress.name"); ?>"> 
       <input type="file" size="35" name="userfile" /> 
       <br><br> 
       <input type="submit" class="defaultbtn" name="Upload" value="Upload" onclick="showLoadingScreen(true)"/> 
       </p> 
      </form> 

我的JavaScript代碼(請注意,上傳和響應處理功能具有普遍性,因爲他們接受來自幾種不同的形式上傳了用於上傳配置,固件等)。

function sendUploadRequest(form_name) 
{ 
    job_name="Upload"; 
    var http = createRequestObject(); 
    http.open("GET", "actions/progress.php?form_name="+form_name); 
    http.onreadystatechange = function() { handleResponse(http,"sendUploadRequest('"+form_name+"')"); }; 
    http.send(null); 
} 

function startUpload(form_name) 
{ 
    showLoadingScreen(true); 
    postDataSync("actions/uw.php"); 
    document.getElementById("loadingtext").innerHTML="Uploading file..."; 
    setTimeout("sendUploadRequest('"+form_name+"')", 200); 
} 

function handleResponse(http,fun_name) 
{ 
    hideInfo(); 
    var response; 
    if (http.readyState == 4) 
    { 
     response = http.responseText; 
     document.getElementById("loadingtext").innerHTML = response + "%"; 

     if (response < 100) 
     { 
      setTimeout(fun_name, 200); 
     } 
     else 
     { 
      showLoadingScreen(false); 
      if(job_name=="") 
       printInfo("Job completed successfuly"); 
      else 
      { 
       if(job_name=="Upload"&&upload_type=="config") 
       { 
        if(hidden_iframe.window.document.body.innerHTML=="SUCCESS") 
        { 
         printInfo(job_name+" completed successfuly"); 
         showLoadingScreen(true); 
         document.getElementById("loadingtext").innerHTML="Restoring backup..."; 
         var result=postDataSync("actions/extract_backup.php"); 
         showLoadingScreen(false); 
         if(result.substring(0,5)=="ERROR") 
         { 
          printError("Error while extracting backup configuration:<br><br>"+result.substring(6)); 
         } 
         else if(result.substring(0,7)=="SUCCESS") 
         { 
          printInfo("Backup configuration restored successfully"); 
         } 
         else 
         { 
          printError("Unknown error while extracting backup. Please contact service."); 
         } 
        } 
        else 
        { 
         printInfo(job_name+" was not completed because of errors"); 
        } 
       } 
       else 
       { 
        if(hidden_iframe.window.document.body.innerHTML=="SUCCESS") 
         printInfo(job_name+" completed successfuly"); 
        else 
         printError(job_name+" was not completed because of errors"); 
       } 
      } 
     } 
    } 
} 

function createRequestObject() 
{ 
    var http; 
    if (navigator.appName == "Microsoft Internet Explorer") 
    { 
     http = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    else 
    { 
     http = new XMLHttpRequest(); 
    } 
    return http; 
} 

我的PHP代碼progress.php

<?php 
session_start(); 
//print_r($_SESSION); 
$key = ini_get("session.upload_progress.prefix") . $_GET['form_name']; 
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; 
} 
+0

我沒有看到任何'session_start()調用' – Nanne 2013-05-09 09:16:06

+0

開始session_start() – 2013-05-09 09:16:35

+0

感謝您的迴應。我編輯過我的帖子,在progress.php中包含session_start()。在調試過程中,我在某個時候刪除了它。不幸的是,這不是一個問題。我使用print_r打印出整個會話內容並檢查了firebug中的響應 - $ _SESSION是一個空數組。 – Wookie88 2013-05-09 09:20:05

回答