繁体   English   中英

使用Apache,Perl和jQuery进行HTTP流传输?

[英]HTTP Streaming with Apache, Perl, and jQuery?

我正在尝试为页面准备概念证明,该页面将接受用户选择的文件,对其进行处理,然后将其返回,同时报告过程的状态。 我认为最好的解决方案可能是HTTP流传输,但是我只能在Firefox(而不是Chrome或IE8)中使用它。

load.js

$(function() {
        var xhr = $.ajax({
                url: '/nph-handleRequest.cgi'
                ,type: 'get'
        });

        collectPartial(xhr,'');
});

var collectPartial = function (xhr,lastContent) {
        alert(xhr.readyState);
        if (xhr.readyState == 3 && lastContent != xhr.responseText) {
                lastContent = xhr.responseText;
                alert(xhr.responseText);
        }
        if (xhr.readyState < 4) {
                setTimeout(function() {collectPartial(xhr,lastContent)}, 1000);
        }
}

NPH-handleRequest.cgi

#!/usr/bin/perl
$|=1;
print "$ENV{SERVER_PROTOCOL} 206 Partial Content\n";
print "Server: $ENV{SERVER_SOFTWARE}\n";
print "Content-type: text/plain\n\n";
for ($count = 1; $count < 5; $count++) {
        print time();
        print "\n";
        sleep(2);
}

如我所料,在Firefox中,alert(xhr.readyState)始终显示3。 虽然在Chrome中? 1.在IE中是2.在任何一个中,都不允许我访问responseText。

关于我在做什么错的任何建议,将不胜感激。

编辑1

实际上是MiniServ,不是Apache。 服务器似乎并不是问题所在,因为它可以在一个浏览器中工作,而在另一个浏览器中工作。

编辑2

发现CGI :: Push后,尽管警告说它在IE中不起作用,我还是尝试使用它。 奇怪的是,它无法在IE8中正常运行(但不能完美运行),但仍无法在Chrome中运行。

#!/usr/bin/perl
$|=1;
use CGI::Push qw(:standard);

do_push(-next_page=>\&display_time,-delay=>2);

sub display_time {
        my($q,$counter) = @_;
        return undef if $counter > 5;
        return time()," "x256, "\n";
}

我同意Xaxxon。 曾经有一段时间,有些网站尝试通过让服务器偶尔打印出进度字符来执行“假AJAX”,因此浏览器将等待该过程完成,但是每种浏览器都有不同的超时和缓冲规则。

最好的方法是让页面上javascript发出的AJAX请求每n秒轮询一次服务器,询问服务器是否完成了工作,以及何时完成显示结果。 这应该更加可靠,如果服务器停止响应或作业花费太长时间,您甚至可以让代码放弃并显示一条错误消息。

我建议您采用其他方法。 当用户上传文件时,您将在服务器端创建某种作业,然后将用户重定向到具有该作业状态的页面(或通过ajax进行操作)。 然后,当作业完成时,向他们提供已处理的文件。

尝试在单个HTTP步骤中执行此操作的问题是,使用不同的浏览器(如果您希望切换使用的浏览器,可能使用不同的Web服务器,则可能会遇到不同的行为)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM