0

我正在通过 iframe 包装器中的 POST 上传一些文件,这些文件可能需要异常多的时间来处理。

在我输出要由 iframe 的 onload 事件捕获的结果之前,我想让用户以某种方式知道上传已经完成,现在处理已经开始。

否则用户可能会因漫长的等待而感到困惑。

我正在考虑显示一条初始消息,然后在完成后添加另一行,然后在 iframe 中比较输出页面的内容。但由于某种原因,这种方法永远不会奏效。

例子:

print 'processing started';
for ($i=0; $i < 10; $i++) { 
    echo '...still processing';
    sleep(1);
}
echo 'done';

(期待看到“处理开始”消息,一旦完成加载就“完成”,但它只是在等待 10 秒后一次性吐出)。

所以我想知道如何做到这一点?

我的另一个想法是在页面的开头设置一个重定向标题,这样一旦文件上传,它就会重定向到其他页面,在那里它会进行处理。然后尝试捕获重定向和最终响应。

但这是一种奇怪的方式,它还需要传递提交的参数并将上传的文件从临时文件夹中移动到某个位置,因此一旦输出了 php 脚本,它们就不会被删除。

...所以我想知道是否有更好的方法来做我想做的事情?

4

1 回答 1

1

文件上传完成后,您的 PHP 将被调用,以便您可以 (a) 将文件放在您想要的位置,(b) 向浏览器发出一些 HTML 作为响应,以及 (c) 在您的情况下,开始处理。

所以我要做的是保存文件,然后将处理作为服务器上的后台作业启动(使用命令行 PHP 运行单独的 PHP 脚本,该命令行通过诸如 exec 之类的系统调用之一启动)。给作业一个唯一的 ID,您可以 (a) 创建一个根据 ID 命名的临时文件,(b) 在 HTML 中的某处传递给浏览器,以便我们可以查询该文件是否仍然存在;(c) 当作业完成时,它会删除该文件,因此我们知道它已经完成。

现在响应上传的 HTML 页面可以说“上传完成,处理开始”,然后运行一些 Javascript 来轮询服务器(使用 Ajax - 在 jQuery 中非常简单,直接使用 XMLHttpRequest 不太难)询问作业是否已经完成(通过轮询请求的 URL 中的查询字符串识别作业)。服务器上的轮询脚本查看相关文件是否仍然存在,如果存在,则相应地表示“不,仍在工作”或“是的,完成”。

如果作业有办法告诉它有多远,例如,如果您正在按顺序处理上传的文件,您可以让作业定期将进度百分比写入文件并返回以响应轮询,并在客户端显示为进度条。

于 2012-08-28T19:46:11.473 回答