我正在使用 Ajax、jsp 和 servlet 从头开始编写代码,以显示客户端上传的文件的进度条。我编写了一个简单的表单,并在客户端的 javascript 中调用了 Ajax 回调函数。我在表单上使用 multipart/form-data onSubmit 将文件上传到 webservlet。我能够将文件上传到服务器并按字节将其写入所需的位置,这样我也可以得到实际写入的字节数。
我的问题是这个。
现在,我想使用 ajax 来获取在 while 循环中写入的字节并显示在同一页面上。当我提交表单时,页面重定向到 webservlet。如何保持在同一页面上并使用 Ajax 显示返回的进度(正在上传的字节数)?
//Code inside My POST method of webservlet
//write to file byte by byte (count stored in "totalBytesWritten")
while(totalBytesWritten < formDataLength){
fileOuputStream.write(dataBytes, totalBytesWritten ,1);
totalBytesWritten ++;
}
我希望在 while 循环中通过 AJAX 将“totalBytesWritten”值返回到客户端页面,因为这是正在写入的文件的当前进度。但是我如何在 while 循环中做到这一点?当我提交表单时,页面被重定向到其他页面,但我想在同一页面上显示进度。
我用来从 servlet 向客户端返回数据的代码:
response.getOutputStream().write(totalBytesWritten);
response.getOutputStream().flush();
response.getOutputStream().close();
我的ajax回调函数:
function ajaxCallProgressBar(){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById( "actualCount" ).innerHTML=xmlhttp.responseText();;
}
else {
document.getElementById("actualCount").innerHTML="readystate error!";
}
xmlhttp.open("GET","progressBar",true);
xmlhttp.send();
} //end of function
实际形式是:
<form action="./progressBar" enctype="multipart/form-data" method="post"
onsubmit="ajaxCallProgressBar()">
<p>
Type some text (if you like):<br>
<input type="text" name="textline" size="30">
</p>
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>
如何在同一页面上显示进度条?