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

现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本地,解压,FTP上传到虚拟主机。这些都是累人的体力活,加之本人又懒得很,所以异想天开的觉得要是程序能够自动升级就好了。所以就想了想,写了本文,希望对WEB程序开发者有帮助。这里只针对ASP,因为我只会ASP :-(

先看看传统的win32程序的升级过程(比如杀毒软件),它是依靠软件的升级程序通过网络连接到服务器分析并下载升级文件到本地。

WEB程序有点不一样,因为它是运行于WEB服务器。它最终是要把升级服务器上的文件覆盖到WEB服务器,站长的电脑只是中转。如果直接把升级服务器上的文件Copy到WEB服务器(而不通过站长中转)那就实现了自动升级。

好在系统自带了一个 Microsoft.XMLHTTP 组件用于访问WEB,在ASP中可以调用它来实现连接升级服务器下载升级文件。

以下代码是利用 Microsoft.XMLHTTP下载文件的例子:

  1. <%
  2. Set xPost = CreateObject("Microsoft.XMLHTTP")
  3.          xPost.Open "GET","http://www.xxx.com/test.exe",False
  4.          xPost.Send()
  5.          Set sGet = CreateObject("ADODB.Stream")
  6.          sGet.Mode = 3
  7.          sGet.Type = 1
  8.          sGet.Open()
  9.          sGet.Write(xPost.responseBody)
  10.          sGet.SaveToFile Server.MapPath("update.exe"),2
  11.          set sGet = nothing
  12.          set sPOST = nothing
  13.          response.Write("下载文件成功!<br>")
  14. %> 

上面代码就是把 http://www.xxx.org/test.exe保存到WEB服务器当前目录,至于Microsoft.XMLHTTP 的更多用法还是看看MSDN吧。

如果文件比较多,就会多次调用Microsoft.XMLHTTP连接网络,就可能出现某次连接失败部分文件未能更新的情况,为了避免这种情况,最好是把所有文件打包为一个文件一次下载到WEB后再解包。
呵呵,这里说的打包可不是RAR或者ZIP包,而是我们自己定义。比如把所有文件拼接为一个,然后再根据特殊的记号分开。现在没这么麻烦咯,因为有个现成的办法,我们使用拿来主义就是:把所有文件(二进制形式)及其路径信息放入Access数据库。

下面这个vbs文件(来自海洋顶端2006Plus)就是打包当前目录的所有文件的:

  1.        Dim n, ws, fsoX, thePath
  2.          Set ws = CreateObject("WScript.Shell")
  3.          Set fsoX = CreateObject("Scripting.FileSystemObject")
  4.          thePath = ws.Exec("cmd /c cd").StdOut.ReadAll() & "/"
  5.          i = InStr(thePath, Chr(13))
  6.          thePath = Left(thePath, i - 1)
  7.          n = len(thePath)
  8. On Error Resume Next
  9.          addToMdb(thePath)
  10.          Wscript.Echo "当前目录已经打包完毕,根目录为当前目录"
  11.          Sub addToMdb(thePath)
  12.                    Dim rs, conn, stream, connStr
  13.                    Set rs = CreateObject("ADODB.RecordSet")
  14.                    Set stream = CreateObject("ADODB.Stream")
  15.                    Set conn = CreateObject("ADODB.Connection")
  16.                    Set adoCatalog = CreateObject("ADOX.Catalog")
  17.                    connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Packet.mdb"
  18.                    adoCatalog.Create connStr
  19.                    conn.Open connStr
  20.                    conn.Execute("Create Table FileData(Id int IDENTITY(0,1) PRIMARY KEY CLUSTERED, P Text, fileContent Image)")
  21.                    stream.Open
  22.                    stream.Type = 1
  23.                   rs.Open "FileData", conn, 3, 3
  24.                    fsoTreeForMdb thePath, rs, stream
  25.                    rs.Close
  26.                    Conn.Close
  27.                    stream.Close
  28.                    Set rs = Nothing
  29.                    Set conn = Nothing
  30.                    Set stream = Nothing
  31.                    Set adoCatalog = Nothing
  32.          End Sub
  33.          Function fsoTreeForMdb(thePath, rs, stream)
  34.                    Dim i, item, theFolder, folders, files
  35.                    sysFileList = "$" & WScript.ScriptName & "$Packet.mdb$Packet.ldb$"
  36.                    Set theFolder = fsoX.GetFolder(thePath)
  37.                    Set files = theFolder.Files
  38.                    Set folders = theFolder.SubFolders
  39.                    For Each item In folders
  40.                             fsoTreeForMdb item.Path, rs, stream
  41.                    Next
  42.                    For Each item In files
  43.                             If InStr(LCase(sysFileList), "$" & LCase(item.Name) & "$") <= 0 Then
  44.                                      rs.AddNew
  45.                                      rs("P") = Mid(item.Path, n + 2)
  46.                                      stream.LoadFromFile(item.Path)
  47.                                      rs("fileContent") = stream.Read()
  48.                                      rs.Update
  49.                             End If
  50.                    Next
  51.                    Set files = Nothing
  52.                    Set folders = Nothing
  53.                    Set theFolder = Nothing
  54.          End Function 

以下是解包的ASP文件:

  1. <%
  2.          Sub UnPack()
  3.                    str = Server.MapPath(".") & "/"
  4.                    Set rs = CreateObject("ADODB.RecordSet")
  5.                    Set stream = CreateObject("ADODB.Stream")
  6.                    Set conn = CreateObject("ADODB.Connection")
  7.                    Set oFso = CreateObject("Scripting.FileSystemObject")
  8.                    connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("update.mdb"
  9.                    conn.Open connStr
  10.                    rs.Open "FileData", conn, 1, 1
  11.                    stream.Open
  12.                    stream.Type = 1
  13.                    Do Until rs.Eof
  14.                             theFolder = Left(rs("P"), InStrRev(rs("P"), "/"))
  15.                             If oFso.FolderExists(str & theFolder) = False Then
  16.                                      oFso.CreateFolder(str & theFolder)
  17.                             End If
  18.                             stream.SetEOS()
  19.                             If IsNull(rs("fileContent")) = False Then stream.Write rs("fileContent")
  20.                             stream.SaveToFile str & rs("P"), 2
  21.                             rs.MoveNext
  22.                    Loop
  23.                    rs.Close
  24.                    conn.Close
  25.                    stream.Close
  26.                    Set ws = Nothing
  27.                    Set rs = Nothing
  28.                    Set stream = Nothing
  29.                    Set conn = Nothing
  30.                    Set oFso = Nothing
  31.          End Sub
  32. %> 

嗯,有了以上代码就不难开发出自己的ASP升级程序了,流程无外乎这样:判断是否需要升级(Y) -> 下载升级包 -> 解开升级包覆盖旧文件 -> 删除升级包 -> 更新版本信息 -> OK

写到这里差不多该结束了,还有些诸如版本判断之类的细节就略过略过咯。

希望早日用到自动升级的各类WEB程序,也好让我等懒人乐得悠闲,哈哈。

http://www.webjx.com/htmldata/2007-10-24/1193237369.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值