2014-04-02 37 views
0

我想在PHP 5.4中使用新的session.upload_progress.name功能來獲取文件進度。基本的jQuery&PHP session.upload_progress.name

到目前爲止,我的代碼是這樣的:

<? 
    session_start(); 
?> 
<!DOCTYPE html> 
<head> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
<script type='text/javascript'> 

$(document).ready(function() { 
    $("#jimbo").submit(function() { 
     setInterval(function() { 
      $.ajax({ 
       url: "ajx.php", 
       success: function (data) { 
        $("#feedback").html(data + Math.random(999)); 
       } 
      }); 
      //$("#feedback").html("hello " + Math.random(999)); 
     },500); 
     //return false; 
    }); 
}); 

</script> 
</head> 
<body> 


<h1><a href="test.php">Upload</a></h1> 
<br/> 
<form action="test.php" method="POST" enctype="multipart/form-data" id='jimbo'> 
    <input type="hidden" name="<?=ini_get('session.upload_progress.name'); ?>" value="myupload" /> 
    <input type="file" name="file1" /> 
    <input type="submit" id='submitme' /> 
</form> 

<div id="feedback">Hello</div> 

</body> 
</html> 

然後是ajx.php文件:

<? session_start(); ?> 
<pre> 
<? 
    echo "SESSIONVAR<br/>"; 
    var_dump($_SESSION); 
?> 
</pre> 

現在。當我點擊提交按鈕(選擇文件後)時,文件開始上傳,但setinterval不啓動。但是,如果我有return false;那裏,我得到setInterval結果,但該文件不會開始上傳。如果我提交的文件沒有返回false,並在單獨的窗口中查看ajx.php的內容,我可以看到變量工作正常並正在更新。那麼一旦表單被點擊後,如何獲得#feedback div來更新呢?

會話陣列填充,這裏的問題是與jQuery的,別無其他。

+0

你有沒有想過使用JavaScript的XMLHttpRequest的」對象呢? –

+0

@ReinderWit是的,他使用和Ajax請求:'$ .ajax' –

+0

有趣的是,我測試了它的根。對我而言,所有上傳都不提供進度。在200 MB文件上,進程將不顯示。該文件〜5-10 MB的工作 –

回答

0

您可以使用JavaScript XMLHttpRequest對象的「upload」屬性實現類似的功能。它有幾個你可以涉及的事件,'進展'就是其中之一。

這是我用過的一個樣本。它將從<input type="file">字段中添加與進展(單位:%)行到<div class="progression">爲每個文件:

function startUpload() { 
    var fileInput = document.getElementById("file1"); 

    $('.progression').show(); 
    for(var i = 0;i<fileInput.files.length;i++) { 
     doFileUpload(fileInput.files[i]); 
    } 
} 

function doFileUpload(file) { 
    var xhr = new XMLHttpRequest(); 

    var data = new FormData(); 
    var $progress = $('<div class=\"progress\"><p>' + file.name + ':</p><span>0</span>%</div>'); 
    $('div.progression').append($progress); 
    data.append("file", file); 
    data.append("album", $("#album").val()); 

    xhr.upload.onprogress = function(e) { 
     var percentComplete = (e.loaded/e.total) * 100; 
     $progress.find('span').text(Math.ceil(percentComplete)); 
    }; 

    xhr.onload = function() { 
    if (xhr.status == 200) { 
     var result = JSON.parse(xhr.responseText); 
     if(result.success == "true") { 
      console.log("Great success!"); 
     } 
     else { 
      console.log("Error! Upload failed"); 
     } 
    }; 

    xhr.onerror = function() { 
     console.log("Error! Upload failed."); 
    }; 

    xhr.open("POST", "/_admin/_inc/upload.php", true); 
    xhr.send(data); 
} 
+0

@AdrianPreuss **不**,不是。請在跳到結論之前正確閱讀我的問題。 – Chud37

+0

@ Chud37看看Mozilla的開發頁面:https://developer.mozilla.org/nl/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest,有很多有趣的東西,你可以使用... –

+0

@ReinderWit,那很酷,謝謝你,但我非常接近這個工作。我只需要知道我在做什麼錯誤,以便在表單上傳時運行'setInterval()'。 – Chud37