获取所有已上传图片的消息,而不是每个图片

时间:2016-07-07 07:31:49

标签: jquery ajax perl

我通过AJAX请求将一些图像发送到Perl脚本

$("form#multiupload").submit(function(){

    var formData = new FormData($(this)[0]);

    $.ajax({
        url:   "/cgi-bin/upload_my_images.pl",
        type:        'POST',
        async:       false,
        cache:       false,
        contentType: false,
        processData: false,
        data:        formData,
        success:     function (data) {
            alert(data)
        }
    });

    return false;
});

我使用Perl将图像上传到服务器

my @fh = $cgi->param("img");

foreach my $fh (@fh) {

    my $uploaddir = 'somedir';
    my $serverFile = $uploaddir . "/" . ( split( /[\\\/]/, $filename ) )[-1];
    my $buffer;

    open( FILE, ">$serverFile" ) or die $!;
    binmode FILE;
    binmode $fh;

    while ( my $bytesread = read( $fh, $buffer, 1024 ) ) {
        print FILE $buffer;
    }

    close(FILE);
}

上传成功后,我收到提醒信息。

是否有可能在所有图片上传成功后收到消息,或者我是否必须使用自己的AJAX请求上传每个图片?

2 个答案:

答案 0 :(得分:1)

首先(最重要的是)摆脱async: false 。使用它是一种可怕的做法,因为它会阻止UI线程。如果您检查控制台,那么您将看到浏览器警告您不要使用它。

其次,如果您想要上传每个文件的个别消息,那么您需要单独发送它们,因为progress事件仅适用于整个请求。

你可以用老式的方式做,并发送一个请求进行上传,然后每隔1秒发送一次其他请求来监控其进度并检查上传完成的文件,但这会给你带来额外的负担服务器,坦率地说,是一个丑陋的小屋。

答案 1 :(得分:0)

我用这种方式解决了问题:

  1. 我创建了一个会话ID,并通过ajax将表单发送到服务器。
  2. perl脚本上传每个图像并执行一些处理。随后,脚本将进程的状态写入日志文件(由sesseion id命名)。在最后一个循环之后,将完成标志写入日志。
  3. 在客户端,我每隔2秒用jquery .get()检查日志文件的内容并将其写入DOM。如果设置了完成标志,则该过程将被取消,并且将向服务器发送信号以删除日志文件。
  4. 也许不是最好的方式,但它运作正常......