怎样让 ASP 程序实现自动升级功能
也有个网站,现在流行虚拟主机建站。也算是个站长咯。当了近一年的站长,感到网站顺序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到外地,解压, FTP 上传到虚拟主机。这些都是累人的体力活,加之自己又懒得很,所以异想天开的觉得要是顺序能够自动升级就好了所以就想了想,写了本文,希望对 WEB 顺序开发者有帮助。这里只针对 ASP 因为我只会 ASP :-
先看看传统的 win32 顺序的升级过程(比如杀毒软件)依靠软件的升级顺序通过网络连接到服务器分析并下载升级文件到外地。
因为它运行于 WEB 服务器。最终是要把升级服务器上的文件覆盖到 WEB 服务器,WEB 顺序有点不一样。站长的电脑只是中转。如果直接把升级服务器上的文件 Copi WEB 服务器(而不通过站长中转)那就实现了自动升级。
好在系统自带了一个 Microsoft.XMLHTTP 组件用于访问 WEB ASP 中可以调用它来实现连接升级服务器下载升级文件。
以下代码是利用 Microsoft.XMLHTTP 下载文件的例子:
<%
Set xPost = CreateObject "Microsoft.XMLHTTP"
"http://www.0x54.org/test.exe", xPost.Open "GET".False
xPost.Send
Set sGet = CreateObject "ADODB.Stream"
sGet.Mod = 3
sGet.Typ = 1
sGet.Open
sGet.Writ xPost.responseBodi
sGet.SaveToFil Server.MapPath "update.exe" .2
set sGet = nothing
set sPOST = nothing
response.Writ " 下载文件胜利! <br>"
%>
至于 Microsoft.XMLHTTP 更多用法还是看看 MSDN 吧。 上面代码就是把 http://www.0x54.org/test.ex 保管到 WEB 服务器当前目录。
就会多次调用 Microsoft.XMLHTTP 连接网络,如果文件比较多。就可能出现某次连接失败局部文件未能更新的情况,为了防止这种情况,最好是把所有文件打包为一个文件一次下载到 WEB 后再解包。
这里说的打包可不是 RAR 或者 ZIP 包,呵呵。而是自己定义。比如把所有文件拼接为一个,然后再根据特殊的记号分开。现在没这么麻烦咯,因为有个现成的方法,使用拿来主义就是把所有文件(二进制形式)及其路径信息放入 Access 数据库。
下面这个 vb 文件(来自海洋顶端 2006Plu 就是打包当前目录的所有文件的
ws, Dim n. fsoX, thePath
Set ws = CreateObject "WScript.Shell"
Set fsoX = CreateObject "Scripting.FileSystemObject"
thePath = ws.Exec "cmd /c cd" .StdOut.ReadAl & "/"
Chr 13 i = InStr thePath.
i - 1 thePath = Left thePath.
n = len thePath
On Error Resum Next
addToMdb thePath
根目录为当前目录 Wscript.Echo " 当前目录已经打包完毕 ."
Sub addToMdb thePath
conn, Dim rs. 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.Cr connStr
conn.Open connStr
1 PRIMARY KEY CLUSTERED, conn.Execut "Creat Tabl FileData Id int IDENTITY 0. P Text, fileCont Image "
stream.Open
stream.Typ = 1
conn, rs.Open "FileData". 3, 3
rs, fsoTreeForMdb thePath. stream
rs.Close
Conn.Close
stream.Close
Set rs = Nothing
Set conn = Nothing
Set stream = Nothing
Set adoCatalog = Nothing
End Sub
rs, Function fsoTreeForMdb thePath. stream
item, Dim i. theFolder, folders, files
sysFileList = "$" & WScript.ScriptNam & "$Packet.mdb$Packet.ldb$"
Set theFold = fsoX.GetFold thePath
Set file = theFolder.Files
Set folder = theFolder.SubFolders
For Each item In folders
rs, fsoTreeForMdb item.Path. stream
Next
For Each item In files
"$" & LCase item.Nam & "$" <= 0 The If InStr LCase sysFileList .n
rs.AddNew
n + 2 rs "P" = Mid item.Path.
stream.LoadFromFil item.Path
rs "fileContent" = stream.Read
rs.Update
End If
Next
Set file = Nothing
Set folder = Nothing
Set theFold = 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
conn, rs.Open "FileData". 1, 1
stream.Open
stream.Typ = 1
Do Until rs.Eof
InStrRev rs "P" , theFold = Left rs "P" . "/"
If oFso.FolderExist str & theFold = Fals Then
oFso.CreateFold str & theFold
End If
stream.SetEOS
If IsNull rs "fileContent" = Fals Then stream.Writ rs "fileContent"
stream.SaveToFil 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 -> 下载升级包 -> 解开升级包覆盖旧文件 -> 删除升级包 -> 更新版本信息 -> O 嗯。K
写到这里差不多该结束了还有些诸如版本判断之类的细节就略过略过咯。
也好让我等懒人乐得悠闲,希望早日用到自动升级的各类 WEB 顺序。哈哈。