CakePHP,AJAX - 显示在后台运行的方法的进度

时间:2011-05-19 12:10:32

标签: javascript ajax cakephp progress

我不知道该如何解决这个问题。

我有一个小型图库脚本的管理面板。您创建图库,然后通过FTP上传图像(到指定的文件夹,每个图库有100个图像,使用FTP更容易)。

在画廊列表中,每个画廊旁边都有一个“创建拇指”链接,该链接转到/admin/images/thumbnails/gallery_id。一切运作良好,正在创建缩略图,该方法使用setFlash信息重定向到列表页面,它们已创建。

但问题是,创建这些小图片需要时间,如果超过10张图片 - 等待浏览器重新加载会很烦人。

我想添加某种进度条。或者只是计算已经处理过的图像。

该方法基本上看起来像这样(其中有更多,但不相关):

function admin_thumbnails($gallery_id)
  {
  $files = $this->File->listDir('/example/www/directory');

  foreach ($files AS $file)
    {
    $this->Attachment->thumbnail('/example/www/directory/'.$file, '/thumbs/', '150', '100', 'resizeCropTop');
    }

  $this->redirect(array('controller' => 'galleries', 'action' => 'index'));
  }

我可以在foreach循环中运行一些东西,但是什么?以及如何向用户显示它?

任何指针都很棒。

此致 保罗

2 个答案:

答案 0 :(得分:1)

这不是一件容易的事。 MVC框架需要在发送HTTP响应之前呈现整个视图。你有两个选择。

首先,您可以使用javascript通过ajax调用此函数并显示进度指示器(动画gif)以让用户知道正在发生的事情。它不会告诉用户服务器在进程中的位置,它只会让他们知道正在进行的工作。这很便宜,很容易,有很多例子。

第二个选项是启动缩略图创建,然后通过ajax“轮询”您的服务器以获得进度。您必须考虑服务器如何在创建缩略图时报告它的进展情况。你也应该能够通过谷歌搜索找到它的例子。这是another SO question that is similar

答案 1 :(得分:0)

一个好的选择可能是在foreach之前创建一个临时文件,然后在每个(成功的?)迭代中创建一个临时文件。在具有简单轮询功能的js中,计算行/标记/数量的数量并绘制进度条。完成此过程后,删除临时文件。

我会这样解决。