【问题标题】:Simple PHP AJAX File Read Progress Problems!简单的 PHP AJAX 文件读取进度问题!
【发布时间】:2009-08-25 11:15:06
【问题描述】:

好吧,我不太擅长描述这些事情,所以请耐心等待..

我试图找到一种显示状态/进度条的方法,以显示 php 读取/解析了多少文本文件的百分比(或其他)。我大致知道我需要做什么(无论是通过计算行数,还是文件大小和实际文本文件的大小),但我一生都无法弄清楚如何实际实现它。我正在使用 PHP/AJAX,我真正想要的只是每隔一段时间(5 秒左右)更新一个 div 以显示状态,直到所有操作完成,然后显示输出。容易哈,虽然我到底应该怎么做,我不知道。我在这里找到了一些关于它的非常有用的帖子,但没有什么我可以用我所拥有的东西来工作。

如果有人能给我一些粗略的提示/想法,我会非常感激(这真的让我很头疼)! 提前致谢!

【问题讨论】:

    标签: php ajax file


    【解决方案1】:

    怎么样...

    我们必须假设有某种方法可以确定总作业 (100%) 和 php 脚本所处的点(完成百分比),所以如果它正在读取/解析文本文件,你可以解析函数首先将总行数写入数据库或文本文件。然后它还可以每 5 秒将它所在的行号写入同一个文件。 js ajax 函数调用该文本文件以获取总数和它所在的点。 php文本解析器完成后,会销毁状态文件,防止占用服务器空间、文件名冲突等。


    例子:

    首先,(jquery) ajax 函数 POST 到服务器:

     $.post("parser.php", { file: "somefile.txt"} );
     //I admit, I'm not sure if this is how a file would be posted with ajax
    

    接下来,php拉取文件并启动解析器功能:

        $tmpName  = $_FILES['userfile']['tmp_name'];
        $fileName  = $_FILES['userfile']['name'];
    
        //Turn the file into an array, so that you can use the array count for status:
        $content = file($tmpName);
    
        // Get the array count as the total, as it equals the line count:
        $total = count($content);
    
        //Write the filesize to a unique "total" txt file:
        $total_file = fopen($fileName."-total.txt", 'x');
        fwrite($total_file, $total);
        fclose($total_file);
    
        //Pass the Array to the parser function:
        parser($content, $fileName);
    
        //Kill the file when the function is done:
        unlink($fileName);
    
        function parser ($file_array, $filename) {
               //creates the status file and then closes it, to ensure that it
               //exists for the loop but gets overwritten each time
    
               $status_file = fopen($filename."-status.txt", 'x');
               fclose($status_file);
    
               foreach($file_array as $position => $data) {
                      //Do your parsing here //
                       .............
                      //reopen status file and wipe out what is in it already:
                      $status_file = fopen($filename."-status.txt", 'w');
                      fwrite($status_file, $position);
                      fclose($status_file);
                 }
    
           }
    

    因此,由于状态和总文件共享希望上传文件的唯一名称,因此 ajax 函数知道在哪里查找。它可以这样做:

     total = $.get("somefile-total.txt");
    
     current = $.get("somefile-status.txt");
    
     status = current/total;
    

    【讨论】:

    • 您好,感谢您的帮助。我没想过这样做,这是有道理的,尽管写入单独的文本文件不会是一个安全问题吗?应该玩一下它,看看我们怎么走。谢谢
    • 我试图想象某种方式让正在解析的脚本能够在解析时响应 ajax 请求,或者让另一个脚本检查状态,但我很确定两者其中不太可能。另一种选择是打开“长轮询”服务器推送类型的情况,其中 ajax 和脚本之间的连接保持打开状态,并且在上面的示例中循环将位置返回给 ajax 函数而不是文本文件。跨度>
    • 是的,这真是一场噩梦……我可能会坚持使用传统图形……嗯,不过感谢您的所有帮助,非常感谢!可能会调查长民意调查的内容,我确实看过它,因为它看起来很相关。
    • @Anthony,您的一般方法是正确的,也是一个很好的起点,但可以对其进行一些调整。我感觉发送实际文件的第一行不起作用。此外,如果将当前进度和总字节数写入 one 文件,则可以避免 wto 分隔 ajax 请求。所以只需:status = $.get("somefile-status.txt"); 然后在/ 上拆分状态
    • @Josh,我很不确定文件上传位,当然。至于将它写入两个文件,我认为它会简化事情,因为每次总数都是相同的,所以 php 不必每次都输出它,而 ajax 只需请求一次(其中我没有在我的代码中,因为我很草率)。
    【解决方案2】:

    JQuery 提供了一些非常好的库,可以满足您的要求。除非这纯粹是为了学习目的,否则我会看看那些并避免重建轮子。

    http://plugins.jquery.com/search/node/upload

    【讨论】:

    • 啊,我知道...我过去使用过 jquery,效果很好。但是为此我真的不想使用它,这也不是用于上传的。不过,谢谢,我可能不得不走那条路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多