2

我有以下显示表格的代码。上传器 div 部分显示一个 gif 图像来告诉用户文件正在由服务器处理,并且 div 'outdata' 保存文件处理后来自 ajax 调用的输出。我的文件需要很长时间才能在服务器上处理,因为它包含大量信息。假设最后一个文件花了大约 12.11 分钟。

我的问题是,当我上传一个小文件时,它工作得很好。响应显示在 outdata div 部分。但是,当文件大小较大时,似乎服务器会输出文件,因为我将它通过电子邮件发送给我,但是浏览器页面反映的并不相同。它显示文件仍在处理中,图像停留在屏幕上。

1)。浏览器等待 ajax 发送回 responsetext 多长时间 2)。有更好的方法吗?

echo "<form name=\"cre\" id=\"cre\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\">";
    echo "<label for=\"file\">Filename: </label>";
    echo "<input type=\"file\" name=\"file\" id=\"file\" ><br><br>";
    echo "<label for=\"email\">Email: </label>";
    echo "<input id=\"email\" type=\"text\" name=\"email\" maxlength=\"40\"><br><br>";  
    echo "<input type=\"submit\" onclick=\"return validate();\" id=\"submit\" value=\"Submit\">&nbsp;&nbsp;";
    echo "</form>";
    echo "<BR>";
    echo "<div id=\"uploader\"></div>";
    echo "<BR>";
    echo "<div id=\"outdata\">";
    echo "</div>";

这是ajax调用

function validate() 
            {
                var file = $("#file").val();
                if(!file || file == '' || file == null)
                {
                    document.getElementById("outdata").innerHTML="Please select a file";
                    return false;
                }   
                var options = {
                    target: '#outdata',
                    url:'process.php', 
                    data:{
                        accesstype:"cre"
                    },
                    beforeSubmit: function() {
                        $('#uploader').html('<img src="/images/ajax-loader.gif" />');
                        $('input[type=submit]').attr('disabled', true);
                    },
                    success:  function() {

                        $('#uploader').html('');
                        $('input[type=submit]').attr('disabled', false);
                    }
                };
                $('#cre').ajaxSubmit(options);
                return false;   
            }
4

1 回答 1

3

这是您遇到的服务器端超时,而不是客户端。您尚未error在 Ajax 调用中实现处理程序,因此它不会看到 Apache(及其同类)在 30 或 60 秒后自动终止请求(可在 中配置apache2.conf)。

增加最大请求时间是一种选择,但很糟糕,因为它会阻塞服务器资源。最好异步处理。

  1. 当文件成功上传时,向 Ajax 调用返回一个成功代码。这也允许您向最终用户提供有用的反馈,说他现在可以去拿些咖啡并等待处理。
  2. 生成一个后台作业,或者让一个 cron 获取队列中的文件,然后开始处理它。
  3. 使用长轮询机制(或 websockets,如果你在滚动)打开与服务器的长期关系,请求有关进程的更新。这可以是“我是/未完成”,甚至可以是过程的百分位更新。当您开始在后台而不是内联中做事时,一切皆有可能。

您可以使用数据库(在上传时插入作业,让处理作业更新该表中的状态)或使用基于普通文件夹的排队系统(上传到/incoming,cron 扫描该文件夹并/processing在完成时移动到并删除)。

您的网络服务器和他的系统负载会感谢您;)

于 2013-06-05T01:31:31.740 回答