Perl-使用CGI中止上载

Perl-使用CGI中止上载,perl,file-upload,cgi,Perl,File Upload,Cgi,我正在用Perl、PHP和JavaScript(jQuery)编写一个文件管理应用程序,我想让用户能够取消上传 以下是一些背景信息: 当用户选择上载文件时,我将表单的目标更改为iFrame,它将发布到perl脚本。在脚本中,我更新数据库中显示上载当前状态的一行。状态可能是成功,错误,初始化,中止,或过期。当状态为“中止”时,我想完全停止上传 有没有办法从钩子中删除这个脚本?(这样我就不必等待整个文件了。)顺便说一句,-e$filepath可以工作,但它仍然会在整个文件中循环,因此消息直到之后才会

我正在用Perl、PHP和JavaScript(jQuery)编写一个文件管理应用程序,我想让用户能够取消上传

以下是一些背景信息: 当用户选择上载文件时,我将表单的目标更改为iFrame,它将发布到perl脚本。在脚本中,我更新数据库中显示上载当前状态的一行。状态可能是
成功
错误
初始化
中止
,或
过期
。当状态为“中止”时,我想完全停止上传

有没有办法从钩子中删除这个脚本?(这样我就不必等待整个文件了。)顺便说一句,
-e$filepath
可以工作,但它仍然会在整个文件中循环,因此消息直到之后才会显示。无论哪种情况,我都希望脚本完全停止

添加了更多代码:

Perl:

my $cgi = CGI->new(\&hook, \%data, 0);

sub hook { 
    my $status = GetStatus();

    if(-e $$data{filepath} and $status eq "initializing"){
        # send JSON back to browser
        # insert your amazing snippet here
        ... 
    }

    if($status eq "success"){
        # continue writing file to disk
        # update db
        ... 
    }

    if($status eq "abort"){
        # cancel the upload
        # insert your amazing snippet here
        ... 
    }

} 
HTML:

编辑:
我在Google上看到,通过javascript中止请求可能是解决问题的方法。有人能肯定这是不是真的吗?它需要的只是将请求分配给一个变量,然后对其调用abort()方法,例如:
xhr.abort()

如果没有sourcediving,我不知道
CGI
是如何处理上传和调用hook函数的,但是我第一次尝试停止上传将是关闭STDIN

我不知道
CGI
是如何处理上传和调用hook函数的,但是我第一次尝试停止上传是关闭STDIN

我需要重新表述这个问题吗?也许……我还不清楚你到底在问什么。您是否正在寻找一种基于从数据库获取的数据中止CGI请求的方法?或者,您是否在寻找一种方法,使一个CGI请求能够中断另一个可能仍在进行中的CGI请求?还是第三件事?@Dan:第一件
:)
你确定吗?抱歉,在二读代码时,您似乎有其他进程在后台执行上载,您要做的是让第二个请求每秒运行四次,检查状态,然后根据数据库的当前值执行某些操作。我错了吗?丹:你说得对。在钩子里面,我检查状态,并根据所说的状态做需要做的事情:)OP更新了新的信息——可能会让我的问题变得更清楚。我需要重新措辞这个问题吗?也许……我仍然不清楚你到底在问什么。您是否正在寻找一种基于从数据库获取的数据中止CGI请求的方法?或者,您是否在寻找一种方法,使一个CGI请求能够中断另一个可能仍在进行中的CGI请求?还是第三件事?@Dan:第一件
:)
你确定吗?抱歉,在二读代码时,您似乎有其他进程在后台执行上载,您要做的是让第二个请求每秒运行四次,检查状态,然后根据数据库的当前值执行某些操作。我错了吗?丹:你说得对。在钩子内部,我检查状态,并根据所述状态执行需要执行的操作:)OP使用新信息更新-可能会揭示我的问题。您是在mod_perl下运行,还是在纯CGI下运行?这里没有mod_perl。直接的CGI。OP更新了新的信息-可能会揭示我的问题。我假装点击
ESC
键中止STDIN+1您是在mod_perl下运行,还是直接使用CGI?这里没有mod_perl。直接的CGI。OP更新了新的信息-可能会揭示我的问题。我假装点击
ESC
键中止STDIN+1
<iframe id="upload_target" onload="uploadDone();"></iframe>
$('#upload_form').submit(function(data){
    window.setInterval('doProgress()', 250);
});

function doProgress() {
    $.ajax({
        ...
        success: function(data){
            json = $.parseJSON(data);
            if(json.status != null){
                // json.message contains the percentage number
                $("#progressbar").reportprogress(json.message);
            }
        }
    });
}

function uploadDone() { 
    var ret = $('#upload_target').contents().find('body').text();
    var json = jQuery.parseJSON(ret);

    if(json.status != null){
        $.modal.close();
        show_message(json);
    }
}