今天為了WGM的專案裡的檔案功能問題傷透了腦筋, 為什麼呢!?
因為在一般做法, 上傳只是單純在表單Post以後, 程式接收開始處理, 完成後再進行相關的檔案搬移及管理, 再存入關聯資料來連結住檔案(或是放入DB也行), 但是目前遇到了一個極大的問題, 其中為了讓表單更現代化也是其中之一, 最主要的問題發生在, 當有使用者上傳了50MB或100MB的檔案時, 怎麼辦呢?? 就算把MaxUpload開放, 如果不在區域網本地端上傳, 一個80M的檔案會傳到天荒地老, 並等待伺服器回應, 這時...AJAX就很重要了..!!!
接下來, 當然就會想到用進度條來做好了, 目前在xAjax或jQuery上, 都是輕而易舉的, 但是, 問題來了, 本人使用的AJAX技術是源自於andot兄的PHPRPC, 主要是為了主程式輕盈短小, 又可以完全自己Code我要的function, 但是在檔案傳輸上, 因為JS無法取得使用者端電腦資訊, 所以似乎變得不可行, 在訪問了許多資料及PHPRPC愛好者(QQ群: 4927045), 發現只有一位王總曾使用PHPRPC + Flash完全了此項作業, 慘!! 我最不想碰的就是AS, 所以....只能另找他法了!!!
首先找到的是在PHP 4.x時使用的UploadProgressMeter (Google Search), 但是找到的資料說明非常不完全, 而且可供下傳的都是使用PHP 4.x Patch的方式, 我所有的主機都已經使用了PHP 5.2以上了, 後來也提到要安裝HTML_AJAX :
If you want to use the code you need to:
Install HTML_AJAX (pear install HTML_AJAX-alpha)
Download PAFUPMU and install it somewhere accessible.
Add the code to your page using demo.php as an example.
這樣又變得非常之不方便, 所以...我就開始找尋其它資料, 居然被本人發現到, 在PHP 5.2.x後, 已經被納入標準擴充模組了, 這個消息真的是很大快人心, 所以當下開始尋找資料...好了...讓我們開始實現這個作法吧!!!
Step 1:
首先, 要先安裝pear(PHP Extension and Application Repository), 也就是PHP延伸及擴充程式庫, 安裝的方式非常容易, 本人採用Lynx瀏覽器方式來安裝
先安裝Lynx
# yum install lynx
接下來安裝Pear
# lynx -source http://pear.php.net/go-pear | php
安裝時會有數個詢問項, 如果您熟悉安裝資訊及路徑, 您可以依需求自行變更, 如果不清楚, 請全部直接按Enter跳過即可!! 安裝完成後即可開始使用 pear擴充指令來安裝相關的PECL安裝包!!!
相關文件可查詢官方網站 : http://pecl.php.net/index.php
接下來直接安裝由Pear封裝的UploadProgress的擴充套件!!!
PECL : UploadProgress Package (http://pecl.php.net/package/uploadprogress)
指令 Example:
# pear install 檔案包本機位址 或 檔案包網路路徑
ps. 如果您是由5.1.6升級成5.2.4時, 請注意, 因為RPM的DB資料還是舊有的PHP 5.1.6的記錄, 即使使用了 rpmdb -rebuild 重建也無效, 所以還是會造成PHP版本不符而無法升級擴充套件, 可能是因為RPM包沒有移除就直接用編譯方式安裝所致, 本人實在不太敢強制移除RPM包資料, 所以我改用以下指令來強制安裝!!!
# pear install -f 檔案包本機位址 或 檔案包網路路徑
經過測試, 運作正常, 且phpinfo(); 及程式顯示都正常, 即然正常, 那就不要去動他了, 等待高手教學吧..= ="
ps. 請注意Document有註明
| Description | PHP 5.2 is needed |
|---|
如果您的PHP版本未達5.2(含)或以上時, 請您進行升級至5.2.x, 本人等下有空再補寫一篇由PHP 5.1.6升級至5.2.4的文件記錄下來, 以免遺忘, 為什麼呢...因為FC5預設就是PHP 5.1.6, 我是用FC7所以沒有問題, FC5的使用者就很需要的, 其它的PHP 4.x --> PHP 5.2.x資料就一堆了, 所以不需要再提供了..^^
請參考: PHP 5.1.6 升級至 PHP 5.2.4 實作手記
安裝完成後, 打開您伺服器上的php_info(); 來看, 您就會看到您的PHP已經支援了UploadProgress進度條的支援了, 至於如何使用進度條的範例, 將會在下一篇上說明, 請大家多多利用!!!
架設環境:
OS: Linux Fedora Core 7 i386
PHP: PHP 5.2.4





14/03/2008, 23:07
我是因為版本問題才會用這種方法..您是用FedoraCore8的話..我記得他有直接的Packet可以下載安裝..用Pecl裝...指令是Pear install 套件包位置..
也不會有apc.ref1867的問題..
另外我是用純Linux環境..win32我就不知道了...
我明天有空找一下資料看看
07/03/2008, 02:48
你好 lover 我想請問你一下~ 你是使用pear指令去安裝uploadprogress嗎?還是pecl指令? 因為我使用pecl指令去安裝uploadprogress,phpinfo()裡面都顯示正常,用function_exists()去查uploadprogress_get_info()這函式也存在~但是uploadprogress_get_info()這函式就總是NULL,讓我很火 >< (這是在fedora8上測試的) 另外我也在win上面做過測試,直接loading官網pecl提供的php_uploadprogress.dll,程式跑下去,apache當機,無言>< 不知道你有何見解或是也曾遇過同樣的情況?
03/02/2008, 17:51
感謝您lover:
好像Linux有許多的優勢存在,
雖然有點害怕去接觸,但是該學的還是得學了。
再一次感謝您的解答
並祝您新年快樂!!!~
31/01/2008, 23:25
因為說真的..用了這麼久..我從來沒拿過Win server + Apache + MySQL 來做站..我從Rh7.1就一直用到現在..因為我之前電腦效能太差..用Unix跑比較不吃力..而且早期他就支援VirtualHost是最大賣點...^^
29/01/2008, 20:39
聽起來像是好消息耶..^^(Linux沒問題?)
您是指upload_之後的數字嗎?
每一筆上傳資料我的確有指定一個uniqid("");來當尾碼
所以如果在您的Linux可以同時跑多人的進度
那至少可以知道Linux上沒有問題小弟也就不想繼續學Windows架站了
哈....
萬分感謝您可以抽控回答小弟的問題^_^
28/01/2008, 17:55
在apc.rfc1876的提示裡有設定使用者的辨識ID, 我在Linux上使用時, 有加設random的ID來辨識資料為何使用者上傳中, 你可以看一下原作者的原文說明, 因為我取得的Linux版本裡面我是直接修改使用, 並得知是這個問題, 您的Win32作業方式我就沒摸過了, 不過原理應該也是一樣的哦..^^ 如果有問題再告訴我, 我把那一段原文提供予您^^
25/01/2008, 16:22
你好
我是用WindowsXP架設Apache 2.2也實際使用apc.rfc1867的特性+Flash來呈現上傳進度
單機測試OK 但是當有2人以上同時上傳就出現問題了第一個上傳顯示的進度會因為第二個上傳而停止運作(檔案仍可以繼續上傳只是進度停止)
而第二個上傳進度會從100%以後開始跑....
查了許多資料才發現好像是apc.rfc1867的問題
"the file upload tracking is not threadsafe at this point"
因此想請問您在Linux上會不會有這個問題呢?? 感謝!!!