我用基于Ajax、Javascript、HTML、C的CGI开发以下文件上传进度条,但是无法从CGI脚本读取每个更新的进度条值。
/*****************CLIENT SIDE CODE*************************/
var intervalID;
var percentage;
var request;
var tempvar=0;
var progress;
function polling_start() { // This is called when user hits FILEULOAD button
//alert ("polling_start");
intervalID = window.setInterval(send_request,1000);
}
window.onload = function (){
request = initXMLHttpClient();
progress = document.getElementById('progress');
}
function initXMLHttpClient() {
//alert("send_request");
if (window.XMLHttpRequest){
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else{
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp
}
function send_request()
{
request.onreadystatechange = request_handler;
request.open("GET","progress_bar.txt",true);
request.send(null);
}
function request_handler()
{
if (request.readyState == 4 && request.status == 200)
{
document.getElementById("progress").innerHTML= request.responseText + '%';
document.getElementById("progress").style.width = request.responseText + '%';
document.getElementById("progress").style.backgroundColor = "green";
}
}
/***********************SERVER SIDE CODE*****************************/
cgiFormFileSize("UPDATEFILE", &size); //UPDATEFILE = file being uploaded
cgiFormFileName("UPDATEFILE", file_name, 1024);
cgiFormFileContentType("UPDATEFILE", mime_type, 1024);
buffer = malloc(sizeof(char) * size);
if (cgiFormFileOpen("UPDATEFILE", &file) != cgiFormSuccess) {
exit(1);
}
output = fopen("/tmp/cgi.tar.gz", "w+");
printf("The size of file is: %d bytes", size);
inc = size/(1024*100);
while (cgiFormFileRead(file, b, sizeof(b), &got_count) == cgiFormSuccess)
{
fwrite(b,sizeof(char),got_count,output);
i++;
if(i == inc && j<=100)
{
fptr = fopen("progress_bar.txt", "w");
fprintf(fptr, "%d" ,j);
fseek(fptr, 0, SEEK_SET);
i = 0;
fflush(fptr);
fclose(fptr);
j++; // j is the progress bar increment value
}
}
fclose(output);
cgiFormFileClose(file);
retval = system("mkdir /tmp/update-tmp;\
cd /tmp/update-tmp;\
tar -xzf ../cgi.tar.gz;\
bash -c /tmp/update-tmp/update.sh");
}
/********************************************************************/
Ajax无法读取“ j”的每个递增值。因此,一旦CGI停止写入文本文件,进度条就会开始。但是,Ajax可以显示从1到100的值(如果我将sleep(1)放进去,进度条可以每秒增加一次),但不是在适当的时候。