ASP网站程序自动升级实现的方法
現在流行虛擬主機建站,我也有個網站,也算是個站長咯。當了近一年的站長,感到網站程序每次升級的時候頗為麻煩:先去官方看公告,然后下載升級包到本地,解壓,FTP上傳到虛擬主機。這些都是累人的體力活,加之本人又懶得很,所以異想天開的覺得要是程序能夠自動升級就好了。所以就想了想,寫了本文,希望對WEB程序開發者有幫助。這里只針對ASP,因為我只會ASP :-(
先看看傳統的win32程序的升級過程(比如殺毒軟件),它是依靠軟件的升級程序通過網絡連接到服務器分析并下載升級文件到本地。
WEB程序有點不一樣,因為它是運行于WEB服務器。它最終是要把升級服務器上的文件覆蓋到WEB服務器,站長的電腦只是中轉。如果直接把升級服務器上的文件Copy到WEB服務器(而不通過站長中轉)那就實現了自動升級。
好在系統自帶了一個 Microsoft.XMLHTTP 組件用于訪問WEB,在ASP中可以調用它來實現連接升級服務器下載升級文件。
以下代碼是利用 Microsoft.XMLHTTP下載文件的例子:
<%
Set xPost = CreateObject("Microsoft.XMLHTTP")
???????? xPost.Open "GET","http://www.xxx.com/test.exe",False
???????? xPost.Send()
???????? Set sGet = CreateObject("ADODB.Stream")
???????? sGet.Mode = 3
???????? sGet.Type = 1
???????? sGet.Open()
???????? sGet.Write(xPost.responseBody)
???????? sGet.SaveToFile Server.MapPath("update.exe"),2
???????? set sGet = nothing
???????? set sPOST = nothing
???????? response.Write("下載文件成功!<br>")
%>
上面代碼就是把 http://www.xxx.org/test.exe保存到WEB服務器當前目錄,至于Microsoft.XMLHTTP 的更多用法還是看看MSDN吧。
如果文件比較多,就會多次調用Microsoft.XMLHTTP連接網絡,就可能出現某次連接失敗部分文件未能更新的情況,為了避免這種情況,最好是把所有文件打包為一個文件一次下載到WEB后再解包。
呵呵,這里說的打包可不是RAR或者ZIP包,而是我們自己定義。比如把所有文件拼接為一個,然后再根據特殊的記號分開。現在沒這么麻煩咯,因為有個現成的辦法,我們使用拿來主義就是:把所有文件(二進制形式)及其路徑信息放入Access數據庫。
下面這個vbs文件(來自海洋頂端2006Plus)就是打包當前目錄的所有文件的:
?????? Dim n, ws, fsoX, thePath
???????? Set ws = CreateObject("WScript.Shell")
???????? Set fsoX = CreateObject("Scripting.FileSystemObject")
???????? thePath = ws.Exec("cmd /c cd").StdOut.ReadAll() & "/"
???????? i = InStr(thePath, Chr(13))
???????? thePath = Left(thePath, i - 1)
???????? n = len(thePath)
On Error Resume Next
???????? addToMdb(thePath)
???????? Wscript.Echo "當前目錄已經打包完畢,根目錄為當前目錄"
???????? Sub addToMdb(thePath)
?????????????????? Dim rs, conn, stream, connStr
?????????????????? Set rs = CreateObject("ADODB.RecordSet")
?????????????????? Set stream = CreateObject("ADODB.Stream")
?????????????????? Set conn = CreateObject("ADODB.Connection")
?????????????????? Set adoCatalog = CreateObject("ADOX.Catalog")
?????????????????? connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Packet.mdb"
?????????????????? adoCatalog.Create connStr
?????????????????? conn.Open connStr
?????????????????? conn.Execute("Create Table FileData(Id int IDENTITY(0,1) PRIMARY KEY CLUSTERED, P Text, fileContent Image)")
?????????????????? stream.Open
?????????????????? stream.Type = 1
????????????????? rs.Open "FileData", conn, 3, 3
?????????????????? fsoTreeForMdb thePath, rs, stream
?????????????????? rs.Close
?????????????????? Conn.Close
?????????????????? stream.Close
?????????????????? Set rs = Nothing
?????????????????? Set conn = Nothing
?????????????????? Set stream = Nothing
?????????????????? Set adoCatalog = Nothing
???????? End Sub
???????? Function fsoTreeForMdb(thePath, rs, stream)
?????????????????? Dim i, item, theFolder, folders, files
?????????????????? sysFileList = "$" & WScript.ScriptName & "$Packet.mdb$Packet.ldb$"
?????????????????? Set theFolder = fsoX.GetFolder(thePath)
?????????????????? Set files = theFolder.Files
?????????????????? Set folders = theFolder.SubFolders
?????????????????? For Each item In folders
??????????????????????????? fsoTreeForMdb item.Path, rs, stream
?????????????????? Next
?????????????????? For Each item In files
??????????????????????????? If InStr(LCase(sysFileList), "$" & LCase(item.Name) & "$") <= 0 Then
???????????????????????????????????? rs.AddNew
???????????????????????????????????? rs("P") = Mid(item.Path, n + 2)
???????????????????????????????????? stream.LoadFromFile(item.Path)
???????????????????????????????????? rs("fileContent") = stream.Read()
???????????????????????????????????? rs.Update
??????????????????????????? End If
?????????????????? Next
?????????????????? Set files = Nothing
?????????????????? Set folders = Nothing
?????????????????? Set theFolder = Nothing
???????? End Function
以下是解包的ASP文件:
<%
???????? Sub UnPack()
?????????????????? str = Server.MapPath(".") & "/"
?????????????????? Set rs = CreateObject("ADODB.RecordSet")
?????????????????? Set stream = CreateObject("ADODB.Stream")
?????????????????? Set conn = CreateObject("ADODB.Connection")
?????????????????? Set oFso = CreateObject("Scripting.FileSystemObject")
?????????????????? connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("update.mdb")
?????????????????? conn.Open connStr
?????????????????? rs.Open "FileData", conn, 1, 1
?????????????????? stream.Open
?????????????????? stream.Type = 1
?????????????????? Do Until rs.Eof
??????????????????????????? theFolder = Left(rs("P"), InStrRev(rs("P"), "/"))
??????????????????????????? If oFso.FolderExists(str & theFolder) = False Then
???????????????????????????????????? oFso.CreateFolder(str & theFolder)
??????????????????????????? End If
??????????????????????????? stream.SetEOS()
??????????????????????????? If IsNull(rs("fileContent")) = False Then stream.Write rs("fileContent")
??????????????????????????? stream.SaveToFile str & rs("P"), 2
??????????????????????????? rs.MoveNext
?????????????????? Loop
?????????????????? rs.Close
?????????????????? conn.Close
?????????????????? stream.Close
?????????????????? Set ws = Nothing
?????????????????? Set rs = Nothing
?????????????????? Set stream = Nothing
?????????????????? Set conn = Nothing
?????????????????? Set oFso = Nothing
???????? End Sub
%>
嗯,有了以上代碼就不難開發出自己的ASP升級程序了,流程無外乎這樣:判斷是否需要升級(Y) -> 下載升級包 -> 解開升級包覆蓋舊文件 -> 刪除升級包 -> 更新版本信息 -> OK
寫到這里差不多該結束了,還有些諸如版本判斷之類的細節就略過略過咯。
希望早日用到自動升級的各類WEB程序,也好讓我等懶人樂得悠閑,哈哈。
總結
以上是生活随笔為你收集整理的ASP网站程序自动升级实现的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 显示ip地址及包含采集功能的全套函数源代
- 下一篇: ASP保存远程图片到本地 同时取得第一张