PHP V5.2 為開發人員添加了 hook 以利用實時跟蹤文件上傳進度的功能。本文是 “PHP V5.2 中的新增功能” 系列文章(共五部分)的第 5 部分,將向您展示如何監視文件上傳並相應地編寫代碼,以及如何創建 PHP 進度條。
Web 2.0 是 Internet 上最炙手可熱的時髦字眼,投資者紛紛把資金投入到涉及這項技術的投資項目中。數以百萬計的 Web 站點和應用程序覆蓋的描述性術語有很多。使用 Web 2.0,我們將描述一類 Web 站點,這些站點都提供了了解 Internet 上數以百萬計用戶心聲的途徑。與眾不同之處在於它們全都為用戶提供了交流和分享與共同利益相關的觀點和數據的場所,這些站點可以快速生成大量內容。
每個用戶都將提供某種內容 —— 評論咖啡店、上班路線等。YouTube 在這點上是一個優秀示例,為人們提供一個空間可以上傳視頻並使其他用戶可以觀看這些視頻並提供反饋。YouTube 是 Web 2.0 奉行者的新寵,值得關注的是到目前為止 YouTube 的流行度上升得比 Internet 中的任何一個站點都要快。這種流行度可以歸因於大量各式各樣的內容,以及能夠讓用戶以留言的形式發表自己對內容的看法。並且不僅可以留言,用戶甚至還可以 上傳與視頻相對應的視頻留言。
文本領域
許多接收文件的 Web 站點都會在文本框旁邊安置令人厭惡的 Browse 按鈕,強制要求用戶一次上傳一個文件。這可能要花費很長時間,尤其是在以小型文件組的形式提供視頻、甚至照片或其他項目的情況下。由於每個文件都必須單獨 上傳,因此可能會十分繁瑣。假定上傳超大型文件所花的時間會使耐心不足的用戶感到難以容忍,那麼給這些用戶提供積極反饋避免他們放棄並走開將十分重要。
幸運的是,PHP V5.2 引入到文件上傳過程中的新 hook 使我們可以向用戶實時顯示上傳的進展情況。在本文中,將使用 PHP V5.2 為用戶創建一個進度條(要獲得源代碼, 請點擊下載)。
完整說明
如果安裝並配置了正確的庫,則 PHP V5.2 中的新 “hook” 實際上是在文件傳輸過程中可獲得的數據點。這些新 hook 將使用一種稱為 Alternative PHP Cache 的功能。當 PHP 腳本收到一個上傳文件時,解釋程序將自動檢查 $_POST array 以查找名為 APC_UPLOAD_PROGRESS 的隱藏字段,它將成為緩存變量,存儲關於上傳的信息以便腳本可以訪問上傳文件。當此信息已被緩存並且隨時可以訪問後,可以給用戶提供可視化反饋,從而提高用戶體驗。
我們將介紹 HTML 表單中的 APC 代碼的實現,以及如何在 PHP 中識別該實現及如何訪問緩存的信息。表示此數據有很多方法:從 Ajax 到 FLEX,但是我們要關注的是准備這些前端技術所需的訪問數據的方法。
設置
默 認情況下,PHP V5.2 中的 APC 不啟用。由於新 hook 是 APC 的一部分,因此需要確保安裝擴展並使其可用於 PHP 解釋程序。這將通過下載 php_apc 擴展文件來完成。在我們的例子中,將使用 WAMP 安裝,這是包括 Apache 和 MySQL 的免費獲得打包的 PHP for Windows®。它提供了友好的用戶界面並且由於擁有支持配置選項的菜單而十分易於管理。
要在 WAMP 上設置 APC,請執行以下步驟:
要下載庫和 WAMP,請參閱 參考資料。
安裝 WAMP。
把 php_apc.dll 文件放到 PHP 的擴展文件夾中。默認情況下,此文件夾為
使用系統盤 WAMP 菜單來選擇 PHP settings>PHP Extensions>Add Extension。
在彈出的命令行界面中,鍵入 php_apc.dll 並按 Enter。
使用文本編輯器,打開
重新啟動 PHP。
APC 現在應當已設置並被初始化。APC 的 RFC1867 特性 —— 使您可以跟蹤文件上傳的特性 —— 現在應當已被啟用為選項,並且應當准備好探究文件上傳以啟用實時狀態。
可接收文件的帳戶
要接收文件,必須先設置接收文件的表單。很方便的是,HTML 附帶了文件的標准字段類型。同所有 HTML 表單字段一樣,它在邏輯上被命名為類型 file。默認情況下,附帶了顯示在塊右側的便捷 Browse 按鈕。
清單 1. upload.php 的 HTML 表單
- 以下為引用的內容:
- <?php
- $id = $_GET[id];
- ?>
- <form enctype="multipart/form-data" id="upload_form"
- action="target.php" method="POST">
- <input type="hidden" name="APC_UPLOAD_PROGRESS"
- id="progress_key" value="<?php echo $id?>"/>
- <input type="file" id="test_file" name="test_file"/><br/>
- <input onclick="window.parent.startProgress(); return true;"
- phperz.com
- type="submit" value="Upload!"/>
- </form>
需要為此表單創建一個 PHP 頁面,因為需要使用惟一密鑰來跟蹤上傳。最後,它將是用於調用此頁面作為 GET 值的 URL 的一部分。此數字將是稍後將檢索的 APC 緩存條目密鑰的值。要傳遞該值,表單字段需要有一個擁有特殊名稱的隱藏字段,使 APC 知道它需要保存文件上傳狀態。此字段被稱為 APC_UPLOAD_PROGRESS。這是前述的啟動緩存過程的 hook。為確保 PHP 可以訪問緩存中的正確條目,我們使用檢索到的惟一 ID 作為隱藏字段的值,從而創建該值的密鑰。用戶提交表單後 —— 我們將簡短地處理提交按鈕 —— 浏覽器將把文件和密鑰作為發送給服務器的 POST 數據的一部分進行發送。