日期:2014-05-16  浏览次数:20776 次

使用ajax调用cgi取得文件大小的问题
先给出代码:
detectfile.cgi:
C/C++ code

void quit(char* sMessage, int nCode)
{
    cgiHeaderContentType("application/xml; charset=gb2312");
    printf("<?xml version=\"1.0\" encoding=\"gb2312\"?>");
    printf("<webresponse>");
    printf("<code>%d</code>", nCode);
    printf("<message>%s</message>", sMessage);
    printf("</webresponse>");
}
int cgiMain()
{
    int nSize = 0;
    char sTmp[256];
    struct stat sFileStat;

    if(stat("/tmp/upload_12345", &sFileStat) < 0)
    {
        quit("file is not found in server!", 500);
        return 0;
    }
    nSize = sFileStat.st_size;
    snprintf(sTmp, sizeof(sTmp), "%d", nSize);
    quit(sTmp, 200);

    return 0;
}


js函数:
JScript code

var nRet = 0;
function getFileSize()
{
    nRet = 0;
    parent.$.ajax(
    {
        url: "/cgi-bin/abc/detectfile.cgi",
       type: 'GET',
        dataType: 'xml',
        async: false,
        timeout: 5000,

        error: function()
        {
            nRet = -1;
        },

        success: function(sData)
        {
           if(parseInt(parent.$(sData).find("code").text()) != 200)
                nRet = -2;
            else
                nRet = parseInt(parent.$(sData).find("message").text());
        }
    });
    alert(nRet.toString());
}



问题描述:
在一个html页面(假设为test1.html)中加入:
<script>setInterval("getFileSize()", 1000);</script>
每秒钟请求一次文件的大小,另外有一个程序生成upload_12345文件,并且每次写200个字节的数据,然后休眠2秒
再写,这样就可以感觉到文件不断被写入的过程了,所以每次在调用getFileSize函数时应该可以看到动态增长的数
据。现在的问题是,在打开test1.html的时候,可以看到每秒弹出一个提示框,里面会显示取得的数据,但是发觉
以后每次弹出的数据都是和第一次一样的(比如512或234等)。假如我另开一个页面(假设为test2.html),直接
访问"/cgi-bin/abc/detectfile.cgi"的话,每次刷新可以看到数据的动态增长,而这时,test1.html弹出的数据也
会动态增长了。请各位看看,为什么我在test1.html中让程序每秒自动调用一次getFileSize()得到的数据都是一样
的,而在手动调用"/cgi-bin/abc/detectfile.cgi"页面刷新之后才会看到数据的变化呢?在线等...



------解决方案--------------------
jq在IE浏览器默认缓存的问题,加上cache:false
JScript code
function getFileSize()
{
    nRet = 0;
    parent.$.ajax(
    {
       cache:false,//==================
       url: "/cgi-bin/abc/detectfile.cgi",
       type: 'GET',

        dataType: 'xml',
        async: false,
        timeout: 5000,

        error: function()
        {
            nRet = -1;
        },

        success: function(sData)
        {
           if(parseInt(parent.$(sData).find("code").text()) != 200)
                nRet = -2;
            else
                nRet = parseInt(parent.$(sData).find("message").text());
        }
    });
    alert(nRet.toString());
}