ASP 程序实现自动升级功能

时间:2021-05-28

现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,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"当前目录已经打包完毕,根目录为当前目录"
SubaddToMdb(thePath)
Dimrs,conn,stream,connStr
Setrs=CreateObject("ADODB.RecordSet")
Setstream=CreateObject("ADODB.Stream")
Setconn=CreateObject("ADODB.Connection")
SetadoCatalog=CreateObject("ADOX.Catalog")
connStr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=Packet.mdb"
adoCatalog.CreateconnStr
conn.OpenconnStr
conn.Execute("CreateTableFileData(IdintIDENTITY(0,1)PRIMARYKEYCLUSTERED,PText,fileContentImage)")
stream.Open
stream.Type=1
rs.Open"FileData",conn,3,3
fsoTreeForMdbthePath,rs,stream
rs.Close
Conn.Close
stream.Close
Setrs=Nothing
Setconn=Nothing
Setstream=Nothing
SetadoCatalog=Nothing
EndSub
FunctionfsoTreeForMdb(thePath,rs,stream)
Dimi,item,theFolder,folders,files
sysFileList="$"&WScript.ScriptName&"$Packet.mdb$Packet.ldb$"
SettheFolder=fsoX.GetFolder(thePath)
Setfiles=theFolder.Files
Setfolders=theFolder.SubFolders
ForEachitemInfolders
fsoTreeForMdbitem.Path,rs,stream
Next
ForEachitemInfiles
IfInStr(LCase(sysFileList),"$"&LCase(item.Name)&"$")<=0Then
rs.AddNew
rs("P")=Mid(item.Path,n+2)
stream.LoadFromFile(item.Path)
rs("fileContent")=stream.Read()
rs.Update
EndIf
Next
Setfiles=Nothing
Setfolders=Nothing
SettheFolder=Nothing
EndFunction


以下是解包的ASP文件:

<%
SubUnPack()
str=Server.MapPath(".")&"\"
Setrs=CreateObject("ADODB.RecordSet")
Setstream=CreateObject("ADODB.Stream")
Setconn=CreateObject("ADODB.Connection")
SetoFso=CreateObject("Scripting.FileSystemObject")
connStr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&Server.MapPath("update.mdb")
conn.OpenconnStr
rs.Open"FileData",conn,1,1
stream.Open
stream.Type=1
DoUntilrs.Eof
theFolder=Left(rs("P"),InStrRev(rs("P"),"\"))
IfoFso.FolderExists(str&theFolder)=FalseThen
oFso.CreateFolder(str&theFolder)
EndIf
stream.SetEOS()
IfIsNull(rs("fileContent"))=FalseThenstream.Writers("fileContent")
stream.SaveToFilestr&rs("P"),2
rs.MoveNext
Loop
rs.Close
conn.Close
stream.Close
Setws=Nothing
Setrs=Nothing
Setstream=Nothing
Setconn=Nothing
SetoFso=Nothing
EndSub
%>


嗯,有了以上代码就不难开发出自己的ASP升级程序了,流程无外乎这样:判断是否需要升级(Y)->下载升级包->解开升级包覆盖旧文件->删除升级包->更新版本信息->OK
写到这里差不多该结束了,还有些诸如版本判断之类的细节就略过略过咯。
希望早日用到自动升级的各类WEB程序,也好让我等懒人乐得悠闲,哈哈。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章