【问题标题】:CGI Buffering issueCGI 缓冲问题
【发布时间】:2010-06-02 21:50:58
【问题描述】:

我有一个基于 CGI 的服务器端 CGI 代码:

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+");

inc = size/(1024*100);
fptr = fopen("progress_bar.txt", "w+");    
while (cgiFormFileRead(file, b, sizeof(b), &got_count) == cgiFormSuccess)
{
    fwrite(b,sizeof(char),got_count,output);
    i++;
    if(i == inc && j<=100)
    {
     fprintf(fptr,"%d", j);
     fflush(fptr);
     i = 0;
     j++;   // j is the progress bar increment value
    }
}
fclose(fptr);
cgiFormFileClose(file);
retval = system("mkdir /tmp/update-tmp;\
                 cd /tmp/update-tmp;\
                 tar -xzf ../cgi.tar.gz;\
                 bash -c /tmp/update-tmp/update.sh");

但是,这并不像上面看到的那样工作。它不是一个一个地打印 1,2,...100 到 progress_bar.txt(由 fptr 引用),而是在 ONE GO 处打印,似乎它缓冲然后写入文件。 fflush() 也不起作用。

任何线索/建议将不胜感激。

【问题讨论】:

  • 你怎么知道不是一一写的?
  • 你怎么知道它一口气完成了?循环内没有人为延迟,这将几乎立即完成。
  • 我不明白您要做什么,以及预期的结果是什么。请提供更多信息。
  • 哦,好吧,我不知道这个。谢谢。但与此同时,我找不到合适的答案来回答我的问题。
  • @Am : 请参考stackoverflow.com/questions/2951732/file-upload-progress-bar。只需查看服务器端代码。谢谢

标签: c cgi


【解决方案1】:

首先,在循环之前打开文件,在循环结束后关闭。 IO 太多。

问题出在w+ - 这会截断您的文件。使用a+。 (fopen帮助)

【讨论】:

  • 我也试过了。在循环之前打开文件并在循环之后关闭它,它也不起作用。我不想追加数据,我想每次都更新数据,这就是我使用 w+ 的原因
  • 每次都打印文件开头的值,但是在这种情况下,这不是必需的,因为文件每次都打开和关闭。
  • 好的,所以您希望最终结果是包含“99”的文件?
【解决方案2】:

一个接一个地写,只是它写得如此之快,以至于你几乎不可能看到文件中的值不是 99。 p>

如果您将sleep(1) 放在循环中,这很容易证明,这样它就足够慢,您可以捕捉到它。

【讨论】:

  • 确实如此(我试过 sleep(1);),但不是在所需的位置。一旦 CGI 完成复制数据,并写入文本文件;之后它打印到文本文件。
  • 是什么让你认为cgiFormFileRead() 在文件上传时调用缓慢?上传的文件似乎更有可能被完全缓冲,然后提供给您的 CGI。
  • 你说得对,这种事情正在发生。但是,我不明白“cgiFormFileRead() 调用缓慢,因为文件上传”你知道我现在应该尝试什么
猜你喜欢
  • 2023-03-10
  • 2012-10-06
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2017-04-06
相关资源
最近更新 更多