javascript - 文件上传进度条

标签 javascript c ajax cgi

谁开发过如下文件上传进度条:

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);可以看到进度条每秒递增);但不是在适当的时候。

最佳答案

看看AJAX progress bar看看如何在 JavaScript 中实现这一点。你只需要自己写C代码(服务于包含进度百分比的XML的部分;当然你也可以使用JSON来发送这个数据)。

更新:当您将间隔增加到例如10000?目前,XMLHTTPRequest 连接每秒都会通过在 send_request 中调用 request.open 来重置。

关于javascript - 文件上传进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924903/

相关文章:

java - java .net和javascript之间正则表达式的区别?

javascript - 如何使用 Javascript 客户端对象模型检索 Sharepoint 2010 列表项权限

c - epoll 文件描述符操作

javascript - PHP在不访问网站的情况下执行网站代码

javascript - Ajax 追加结果并制作动画

javascript - Canvas 中的行星、月亮和剪裁弧 - 粗糙边缘

javascript - 使用javascript在网页中 append 重复图像

c - 如何使用 C99 标准类型在大多数平台上实现最大的可移植性和效率?

c - void * 算术

javascript - 在 Ajax 中从 PHP 中拆分数组