2012-08-11 44 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中的查詢字符串標識作業)。服務器上的輪詢腳本會查看相關文件是否仍然存在,如果是,則相應地顯示「不,仍然有效」或「是,已完成」。

如果有一種方法可以告訴工作有多遠,例如,如果您正在按順序處理上傳的文件,那麼您可以定期將作業的進度百分比寫入文件,並在調查結束時將其返回,並在客戶端將其顯示爲進度條。

相關問題