无权限限制服务端无组件打包解包文件及客户端解包文件的原理与实现

文章标题:无需WScript.Shell权限,服务端无组件批量打包、解包文件及客户端解包文件的原理与实现
文章作者:翟振凯 (小琦)
交流方式:
个人站:http://www.xiaoqi.net
前言:
为了鼓励共享精神,请尊重他人劳动成果,转载时,请不要去掉版权,谢谢合作。

虽然本文内服务端代码是以ASP为例子,但方法原理同样适用于PHP、JSP、.NET等语言。

本文以理论为纽带,从服务端如何打包文件讲起,到客户端如何解包文件结束,用大量的实例代码一步一步向大家祥细讲述此功能的实现方法。

全文多次用到了Scripting.FileSystemObject、Adodb.Stream、Shell.Application对文件的操作方法知识,相信对这三个组件不熟悉的朋友看完本文本后,也会对这两个组件的使用有更多的了解。
在讲客户端解包方法时,用到了<I>&#106avascript</I>对客户端文件的操作方法和<I>&#106avascript</I>在客户端连接ACCESS数据库的方法,文内的每一个实例都有祥细的注释,所以,有点基础的朋友都会很容易的理解。看完此文,对<I>&#106avascript</I>对客户端文件的操作方法和<I>&#106avascript</I>在客户端连接ACCESS数据库的方法不了解的朋友也会有一定的帮助。

教人一套好的方法,远远要胜过送给别人一套完整的程序。
勤劳的人会从中得到启迪,从而开发出功能更加完善、强大的程序,懒惰的人却只会抱怨你为什么不给他一套他可以直接拿来用的完整程序。此文只献给勤劳的程序员们。

授人以鱼,不如授人以渔,这里主要讲的是方法和原理,希望大家看完后,能够从中得到些帮助和启发。

无需WScript.Shell权限,服务端无组件批量打包、解包文件及客户端解包文件的原理与实现

文章作者:翟振凯 (小琦)
为了鼓励共享精神,请尊重他人劳动成果,转载时,请不要去掉版权,谢谢合作。
先说原理:
一、服务端打包:
1、循环列出要打包的所有文件及文件夹
循环列出要打包的所有文件及文件夹的方法有很多种,在ASP中,常见的方法有:用Shell.Application、和Scripting.FileSystemObject等。。。
2、循环过程中,将每个文件和文件夹的信息存入数据库
用ASP内置的Adodb.Stream组件将文件和文件夹的信息(文件名、文件路径、文件二进制数据流)存入ACCESS数据库

二、服务端解包:
1、循环从数据库里读取每个文件的信息,根据文件路径、文件名、文件二进制数据流进行用Adodb.Stream保存生成对应文件
2、如果文件夹不存在,就自动新建文件夹

三、客户端解包:
1、在客户端用<I>&#106avascript</I>与数据库建立连接,循环从数据库里读取每个文件的信息,根据文件路径、文件名、文件二进制数据流进行用Adodb.Stream保存生成对应文件
2、如果文件夹不存在,就自动新建文件夹
3、因为高版本的IE浏览器内不可以直接调用Adodb.Stream组件,所以要把解包文件存为HTML应用程序文件.HTA
注:在客户端用VBSCRIPT也可以实现此功能,原理和用<I>&#106avascript</I>是一样的,因为我在昨天写的《用<I>&#106avascript</I>从access数据库提取文件》里已经祥细说明了这个在客户端解包的方法,在下文中,就只给大家提供一个别人写的在客户端用VBSCRIPT从ACCESS数据库里提取文件的方法。

再讲实现:

此文用的数据库结构如下:
表名:FL
FileName:文件名
FileData:二进制文件内容
FilePath:文件路径

一、服务端打包:

1、循环列出要打包的所有文件及文件夹
下面是最常见的两个循环列出文件夹内所有文件的函数,包括子文件夹内的文件夹及文件

第一种:Shell.Application 方法

‘—————–作者:翟振恺(小琦) iisvs.com
Function ListFile(fpath)’列出文件夹内所有内容函数
Dim Shell,Allfile,Folder
Set Shell =Server.CreateObject (“Shell.Application”)
Set Allfile =Shell.Namespace(fpath)

For Each Folder in Allfile.Items
IF Folder.isfolder Then’对象如果是文件夹
Call ListFile(Folder.path) ‘循环调用“列出文件夹内所有内容函数”
response.write Folder.path’输出文件夹路径
response.write “<br>”
Else
response.write Folder.path’输出文件路径
response.write “<br>”
End if
Next

Set Folder=Nothing
Set Allfile=Nothing
Set Shell=Nothing
‘—————–作者:翟振恺(小琦) iisvs.com
End Function

函数调用:

方法1、ListFile(绝对路径)

方法2、ListFile(Server.mappath(相对路径))

第二种:Scripting.FileSystemObject 方法

‘—————–作者:翟振恺(小琦) iisvs.com
Function ListFile(fpath)’列出文件夹内所有内容函数
Dim FSO,F,Dir,File
set FSO=CreateObject(“Scripting.FileSystemObject”)
Set F = FSO.GetFolder(fpath)
Set Dir = F.SubFolders’文件夹集合
Set File = F.Files’文件集合

For Each Folder in Dir’列出文件夹
response.write Folder.Path &”<br>”
Call ListFile(Folder.Path)’列出子文件夹内容
Next

For Each Folder in File’列出文件
response.write Folder.Path &”<br>”
Next

Set File = Nothing
Set Dir =Nothing
Set F=Nothing
Set FSO=Nothing
‘—————–作者:翟振恺(小琦) iisvs.com
End Function

函数调用:

方法1、ListFile(绝对路径)

方法2、ListFile(Server.mappath(相对路径))

2、循环过程中,将每个文件和文件夹的信息存入数据库

把文件夹内所有内容存入数据库的函数
Function ListFile(fpath)’把文件夹内所有内容存入数据库的函数
‘—————–作者:翟振恺(小琦) iisvs.com
‘—-建立数据库连接及打开数据库-小琦
Set Conn=Server.CreateObject(“Adodb.Connection”)
Conn.Open “Provider = Microsoft.Jet.OLEDB.4.0;Data Source =”& 数据库绝对路径

Set Rs=Server.CreateObject(“Adodb.RecordSet”)

‘—-建立数据库连接及打开数据库-小琦

‘—-建立并打开Adodb.Stream对象-小琦
Set objStream=Server.CreateObject(“Adodb.Stream”)
objStream.Type=1
objStream.Open
‘—-建立并打开Adodb.Stream对象-小琦

Dim Shell,Allfile,Folder
Set Shell =Server.CreateObject (“Shell.Application”)
Set Allfile =Shell.Namespace(fpath)

For Each Folder in Allfile.Items
IF Folder.isfolder Then’对象如果是文件夹
Conn.Execute(“Insert Into FL(FilePath)values(‘”&GetDir(Folder.path,Folder.isfolder)&”‘)”)’向数据库添加文件夹信息
Call ListFile(Folder.path) ‘循环调用“列出文件夹内所有内容函数”
Else
objStream.LoadFromFile Folder.path’载入文件
‘—–向数据库添加文件信息—–小琦
Rs.Open “select * from Fl”,conn,3,2
Rs.AddNew
Rs(“FileName”)=GetName(Folder.path)
Rs(“FileData”).appendchunk objStream.Read’写入二进制文件信息
Rs(“FilePath”)=GetDir(Folder.path,Folder.isfolder)
Rs.Update
Rs.Close
‘/—–向数据库添加文件信息—–小琦
End if
Next

Set Folder=Nothing
Set Allfile=Nothing
Set Shell=Nothing
Set objStream=Nothing
‘—————–作者:翟振恺(小琦) iisvs.com
End Function

另外,我们还要用到