2017-06-05 33 views
2

問題: 當我啓動任何瀏覽器時,它會打開它的默認網頁,我打開一個會話到我的 測試文件上傳進度條Web應用程序在該標籤中,或同一個Web App。在一個新的標籤。當我 開始第一次文件上傳時,即使文件仍在上傳 ,它也會顯示進度條直接到100%。如果我再次執行文件上傳,它會按預期工作,進度條顯示加載的文件爲 ,例如20%,43%,80%,98%,然後完成。 我正在使用發佈的示例: - https://www.sitepoint.com/tracking-upload-progress-with-php-and-javascript/僅當第一次上傳時,進度條直接顯示爲100%,上傳顯示如預期

我已經稍微修改它以努力瞭解發生了什麼。

在我的網站上Internet和我的本地服務器上發生此問題。 這兩個系統都是使用Apache2的LINUX。互聯網上的網站使用PHP 5.6.30。我的本地服務器 正在使用PHP 7.1.5。

使用運行Safari,Chrome或FireFox的手機時,可能會再現同樣的問題。 因此,這看起來像基於服務器的問題或我在客戶端 或服務器端的一些編碼問題。

我使用這種類型的代碼上傳視頻文件,我的工作是假定文件 將不會完全上傳,直到至少在第一個進度百分比加載計算之後。如果我在第一次通過時獲得'100'回覆,我認爲進度條讀數錯誤,並建議 應該再次嘗試上傳文件。第二次上傳始終有效。在我的情況下,視頻文件28MB允許的最大尺寸爲 。

有人可以協助解決這個問題嗎?

下面是我的兩個PHP網頁的副本。

File: progress.php 
<?php 
session_start(); 
$key = ini_get("session.upload_progress.prefix") . "form_60"; 
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"; 
    } 
?> 

File: upload2.php 
<?php 
if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_FILES["userfile"])) { 
    // move_uploaded_file() 
    $folder = "tmp/"; 
    //upload the file 
    move_uploaded_file($_FILES["userfile"["tmp_name"], "$folder" . $_FILES["userfile"]["name"]); 
    } 
?> 
<html> 
<head> 
<title>File Upload Progress Bar</title> 
<style> 
    #bar_blank { 
    border: solid 1px #000; 
    height: 20px; 
    width: 300px; 
    } 
    #bar_color { 
    background-color: #006666; 
    height: 20px; 
    width: 0px; 
    } 
    #bar_blank, #hidden_iframe { 
    display: none; 
    } 
</style> 
</head> 
<body> 
<div id="bar_blank"> 
<div id="bar_color"></div> 
</div> 
<div id="Message"></div> 
<form action="" method="POST" 
id="form_60" enctype="multipart/form-data" target="hidden_iframe"> 
<input type="hidden" value="form_60" 
name="<?php echo ini_get("session.upload_progress.name"); ?>"> 
<input type="file" name="userfile"><br> 
<input type="submit" value="Start Upload"> 
</form> 
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe> 
<!script type="text/javascript" src="upload2.js"></script> 
<script type="text/javascript"> 
var FirstTime = 'Y'; 
function toggleBarVisibility() { 
var e = document.getElementById("bar_blank"); 
e.style.display = (e.style.display == "block") ? "none" : "block"; 
} 

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

function sendRequest() { 
var http = createRequestObject(); 
http.open("GET", "progress.php", false); // was GET 
http.onreadystatechange = function() { handleResponse(http); }; 
http.send(null); 
} 

function handleResponse(http) { 
var response; 
if (http.readyState == 4) { 
    response = http.responseText; 
    document.getElementById("bar_color").style.width = response + "%"; 
    document.getElementById("Message").innerHTML = response + "%"; 

alert(response); 
    if (response < 100) { 
     FirstTime = 'N' 
     setTimeout("sendRequest()", 1000); 
    } 
    else { 
     alert(response); 
     toggleBarVisibility(); 
     if (FirstTime == 'N') 
      { 
       document.getElementById("Message").innerHTML = "Done."; 
      } 
     if (FirstTime == 'Y') 
      { 
       document.getElementById("Message").innerHTML = "Error."; 
       alert('System error, please try again.') 
      } 
    } 
} 
} 

function startUpload() { 
toggleBarVisibility(); 
setTimeout("sendRequest()", 1000); 
} 

(function() { 
    document.getElementById("form_60").onsubmit = startUpload; 
})(); 
</script> 
</body> 
</html> 

我現在已經找到了一個解決方法,下面列出了一個解決方法。它涉及從我的應用程序中的啓動頁面執行虛擬請求。在我的情況下,我使用登錄網頁來放置虛擬代碼。

<script type="text/javascript"> 
function createRequestObject() { 
    var http; 
    if (navigator.appName == "Microsoft Internet Explorer") { 
     http = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    else { 
     http = new XMLHttpRequest(); 
     } 
    return http; 
} 
function sendRequest() { 
    var http = createRequestObject(); 
    http.open("GET", "progress.php", false); // was GET 
    http.onreadystatechange = function() { handleResponse(http); }; 
    http.send(null); 
} 
function handleResponse(http) 
    { 
    var response; 
    if (http.readyState == 4) 
     { 
     response = http.responseText; 
     if (response < 100) 
      { 
      setTimeout("sendRequest()", 1000); 
      } 
     } 
} 
function startUpload() { 
    setTimeout("sendRequest()", 1000); 
} 
window.onload = function() { 
    startUpload(); 
} 
</script> 

現在,我已經學到了一些關於會話變量似乎跟着我應該把規則: -

在session_start();

在upload2.php網頁的開始處,因爲這是變量信息來自第一個實例的地方。這然後工作正常。

回答

0

它看起來好像會話沒有在if語句中讀取。如果會話不存在,您只需回顯100%。如果您ammend這一部分:

Progress.php

<?php 
session_start(); 
$key = ini_get("session.upload_progress.prefix") . "form_60"; 
if (!empty($_SESSION[$key])) 
    { 
    $current = $_SESSION[$key]["bytes_processed"]; 
    $total = $_SESSION[$key]["content_length"]; 
    echo $current < $total ? ceil($current/$total * 100) : 100; 
    } else { 
    $_SESSION[$key]["bytes_processed"] = 0;  
    } 
?> 

它不應該直接跳到100%,因爲會議將是積極的,在這點上,而不是先上傳後。沒有經過測試,但值得一試,如果你沒有打敗我,我會在有機會做適當的測試時將這些代碼粘貼到我的測試服務器上!

相關問題