2012-08-11 43 views
0

我正在通过POST在iframe包装器中上传一些文件,这可能需要不寻常的时间来处理。在页面完成PHP处理之前捕获上传文件的时刻?

然后我输出的结果要通过iframe的onload事件捕获我想让用户知道上传已完成,现在处理已经开始。

否则用户可能会被长时间的等待困惑。

我想显示一个初始消息,然后添加一行完成后,然后比较iframe中输出页面的内容。但是这种方法从来不会出于某种原因。

实施例:

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

(期待看到“开始处理”消息,并且“完成”一旦完成装载,但等待10秒后,它只是吐出出来在一个突发)。

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

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

但是,这是一种奇怪的方式,它也需要传递提交的参数,并将上传的文件从临时文件夹中移出,这样一旦php脚本输出就不会被删除。

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

回答

1

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

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

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

如果有一种方法可以告诉工作有多远,例如,如果您正在按顺序处理上传的文件,那么您可以定期将作业的进度百分比写入文件,并在调查结束时将其返回,并在客户端将其显示为进度条。

相关问题