現在流行虛擬主機建站,我也有個網站,也算是個站長咯。當了近一年的站長,感到網站程序每次升級的時候頗為麻煩:先去官方看公告,然後下載升級包到本地,解壓,FTP上傳到虛擬主機。這些都是累人的體力活,加之本人又懶得很,所以異想天開的覺得要是程序能夠自動升級就好了。所以就想了想,寫了本文,希望對WEB程序開發者有幫助。這裡只針對ASP,因為我只會ASP:-(
先看看傳統的win32程序的升級過程(比如殺毒軟件),它是依靠軟件的升級程序通過網絡連接到服務器分析並下載升級文件到本地。
WEB程序有點不一樣,因為它是運行於WEB服務器。它最終是要把升級服務器上的文件覆蓋到WEB服務器,站長的電腦只是中轉。如果直接把升級服務器上的文件Copy到WEB服務器(而不通過站長中轉)那就實現了自動升級。
好在系統自帶了一個Microsoft.XMLHTTP組件用於訪問WEB,在ASP中可以調用它來實現連接升級服務器下載升級文件。
以下代碼是利用Microsoft.XMLHTTP下載文件的例子:
<%
SetxPost=CreateObject("Microsoft.XMLHTTP")
xPost.Open"GET","http://www.0x54.org/test.exe",False
xPost.Send()
SetsGet=CreateObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFileServer.MapPath("update.exe"),2
setsGet=nothing
setsPOST=nothing
response.Write("下載文件成功!<br>")
%>
上面代碼就是把http://www.0x54.org/test.exe保存到WEB服務器當前目錄,至於Microsoft.XMLHTTP的更多用法還是看看MSDN吧。
如果文件比較多,就會多次調用Microsoft.XMLHTTP連接網絡,就可能出現某次連接失敗部分文件未能更新的情況,為了避免這種情況,最好是把所有文件打包為一個文件一次下載到WEB後再解包。
呵呵,這裡說的打包可不是RAR或者ZIP包,而是我們自己定義。比如把所有文件拼接為一個,然後再根據特殊的記號分開。現在沒這麼麻煩咯,因為有個現成的辦法,我們使用拿來主義就是:把所有文件(二進制形式)及其路徑信息放入Access數據庫。
下面這個vbs文件(來自海洋頂端2006Plus)就是打包當前目錄的所有文件的:
Dimn,ws,fsoX,thePath
Setws=CreateObject("WScript.Shell")
SetfsoX=CreateObject("Scripting.FileSystemObject")
thePath=ws.Exec("cmd/ccd").StdOut.ReadAll()&"/"
i=InStr(thePath,Chr(13))
thePath=Left(thePath,i-1)
n=len(thePath)
OnErrorResumeNext
addToMdb(thePath)
Wscript.Echo"當前目錄已經打包完畢,根目錄為當前目錄"