欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP网站程序自动升级实现的方法

程序员文章站 2022-07-01 22:58:07
现在流行虚拟主机建站,我也有个网站,也算是个咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,ftp上传到虚拟主机。这些都是累人的体力活,加之本...

现在流行虚拟主机建站,我也有个网站,也算是个咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,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>")
%>

上面代码就是把 保存到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 ins