2013-10-12 42 views
0

我想檢查上傳的文件的進度。我使用的是具有Session類的Kohana框架,但對於上傳進度,我使用的是原生PHP會話。我在Kohana的bootstrap.php中調用session_start(),這意味着每個頁面請求都會調用session_start()延遲填充session.upload_progress數據

上傳表單提交後,我等了1秒鐘,然後開始調用PHP文件來檢查上傳進度,使用jQuery $.ajax()

問題是$_SESSION[$key]($ key包含上傳數據的關鍵字)沒有在首次調用PHP時設置。我已經嘗試過調試了這一點,並且session_id()返回了正確的會話ID,所以會話肯定是正確的,並且處於活動狀態。在檢查上傳進度之前,我還等了1秒,所以這不是時間問題。即使未設置$_SESSION[$key],我仍可以通過繼續解決此問題,但檢查上傳是否完成的方法是當$_SESSION[$key]未設置。

HTML表單是用jQuery實時創建的,因爲這是一個多文件上傳。下面是一個生成的表單中HTML:

<form action="ajax/upload" id="form-HZbAcYFuj3" name="form-HZbAcYFuj3" method="post" enctype="multipart/form-data" target="frame-HZbAcYFuj3"> 
    <iframe id="frame-HZbAcYFuj3" name="frame-HZbAcYFuj3"></iframe> 
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="HZbAcYFuj3"> 
    <input type="file" id="file-HZbAcYFuj3" name="photo" accept="image/jpeg,image/pjpeg,image/png,image/gif"> 
    <button type="button">+ Select Photo</button> 
</form> 

下面是JavaScript的調用來檢查其進度的PHP:

public function action_uploadprogress() 
{ 
    $id = isset($_POST['id']) ? $_POST['id'] : false; 

    if (!$id) 
     throw new Kohana_HTTP_Exception_404(); 

    $progress = 0; 
    $upload_progress = false; 

    $key = ini_get("session.upload_progress.prefix") . $id; 

    if (isset($_SESSION[$key])) 
     $upload_progress = $_SESSION[$key]; 
    else 
     exit('100'); 

    $processed = $upload_progress['bytes_processed']; 
    $size = $upload_progress['content_length']; 

    if ($processed <= 0 || $size <= 0) 
     throw new Kohana_HTTP_Exception_404(); 
    else 
     $progress = round(($processed/$size) * 100, 2); 

    echo $progress; 
} 

這裏是jQuery的ajax()要求:

this.send_request = function() 
{ 
    $.ajax(
     { 
      url: 'ajax/uploadprogress', 
      type: 'post', 
      dataType: 'html', 
      data: { id: _this.id }, 
      success: 
       function(data, textStatus, jqXHR) 
       { 
        if (textStatus == "success") 
        { 
         if (data < 100) 
          setTimeout(_this.send_request, 1000); 
        } 
       } 
     } 
    ); 
}; 
+0

你在哪裏設置send_request.id? –

+0

爲什麼echo而不是$ this-> response-> body($ progress)? – Darsstar

回答

1

您正在向PHP腳本發送名爲'id'的POST。

但是,文檔說只有當您發送與php.ini中配置的session.upload_progress.name同名的POST時,才能使用上載進度。

所以,換句話說,如果你的session.upload_progress.name設置爲默認值(PHP_SESSION_UPLOAD_PROGRESS),你必須改變下面一行,在send_request功能:

變化:

data: { id: _this.id } 

要:

data: { PHP_SESSION_UPLOAD_PROGRESS: _this.id } 

你也必須改變$_POST['id']$_POST['PHP_SESSION_UPLOAD_PROGRESS']$_POST[ini_get("session.upload_progress.name")]在PHP SCR ipt(以及輸入的名字,以防萬一它不是默認的)。

上傳過程將在上載過程中以及在POSTing與session.upload_progress.name INI設置相同名稱的變量設置爲時在$ _SESSION超全局中可用。當PHP檢測到這樣的POST請求時,它將填充$ _SESSION中的一個數組,其中索引是session.upload_progress.prefix和session.upload_progress.name INI選項的連接值。關鍵是通常通過閱讀這些INI設置檢索,即

來源:http://php.net/manual/pt_BR/session.upload-progress.php

+0

甜,這個固定它!我一直在這個問題上讓自己的大腦在這兩個星期裏受到傷害我發現的所有示例只在隱藏輸入中發送了'

'中的'session.upload_progress.name',而不是在ajax中檢查進度,但他們甚至在同一臺服務器上也能正常工作。這些都不在Kohana中,所以出於某種原因,在Kohana內部,當你提交表單並且PHP填充上傳進度數據,但是在上傳進度檢查中發送'session.upload_progress.name'時,我想踢開始它?不知道,但我很高興不再想這個了!再次感謝。 – Gavin

+0

它說我必須等待6個小時才能獎勵賞金,但如果一切按計劃進行,那麼我會在當天適當喝醉,所以我明天可能會發送它:) – Gavin

+0

@Rafael Figueiredo。你會關心看看http://stackoverflow.com/questions/21703081/php-upload-progress-in-php-5-4-is-not-working-session-variables-not-set? – Sam

1

讓我們看看我可以得到一些甜美的賞金。我的第一個想法是$ key字符串沒有正確設置。

嘗試回顯其值並在整個$ _SESSION變量上執行print_r以跟蹤事情。

現在我根本沒有看到來自action_uploadprogress()的'成功'輸出。我看到了100個我認爲已經完成的工作,但你並沒有在js中檢查。我會建議調查。不妨迴應一下你的計算。我認爲它不太可能,但確保您正確上傳文件,並能夠確定其當前的大小沒有任何問題。

另一個問題可能是你如何用jquery處理ajax。我對此並不十分確定,但我認爲成功選項已被貶值(1.5+)。從

http://api.jquery.com/jQuery.ajax/

$.ajax({ 
    type: "POST", 
    url: "some.php", 
    data: { name: "John", location: "Boston" } 
}).done(function(msg) { 
    alert("Data Saved: " + msg); 
}); 

使用我見過成功的唯一途徑是這樣的....

$.ajax({ 
     type: "POST", 
     url: '/login/spam', 
     data: formData, 
     success: function (data) { 
      if (data == 'value') { 
       //Do stuff 
      } 
     } 
    }); 

不過,我可能是完全錯誤的關於這個....你的設置可能會非常好。我要你做的就是直接在成功/完成的功能是

alert(data); 
alert(textStatus); //if you still use it 

這會告訴你,如果你正在從你的Ajax查詢作出恰當的迴應。

今晚我會檢查幾次,明天我會幫忙。告訴我,我所說的任何事情都有助於什麼

+0

嘿,我真的很感謝你的詳細回覆。拉斐爾戈麥斯菲格雷多實際上正確地解決了問題,並解決了問題。 – Gavin