全国服务热线:400-6866-786
(电话:0791-6336981)
搜 索
首 页 | 软件介绍 | 解决方案 | 视频演示 | 在线体验 | 询价专区 | 咨询论坛 | 下载中心

|

渠道合作 | 关于惠众
采购热线:400-6866-786 0791-6336981
快速了解
惠众OA优势
技术框架
售后服务及其它
 oa点击排行

如何实现真正的动态包含
                                        发布时间:2006-11-11 15:44:11 点击:


   在线体验:http://www.oa169.com

   惠众oa系统包含通知、短消息、邮件、文件收发、公文流转、共享下载、工作日程、工作日志、工作周报、工作总结、个人计划、新闻发布、教学动态(学校版)、工作日志、企业论坛、制度管理、资产管理、在线考勤、通讯录、会议管理等等。同时包含强大的文字、动画、语音提示系统。

如何在服务器端调用winzip命令行对上传的多个文件打包压缩?

要解决这个问题,首先要了解一下Windows Scripting Host,简称为WSH!下面引用一下微软给的解释:
************************************************************************
*  WSH是微软脚本技术系列中的一种,简单讲,就是提供了一种脚本环境,     *
*  在这个环境中,预定义了一些对象,同时也可以使用COM里的其他对象。     *
*  他使用一种脚本引擎来对脚本解释执行,微软自己支持VBSCRIPT和JSCRIPT, *
*  第三方也可以开发自己的脚本引擎。                                    *
************************************************************************
具体点,就是你先编好一些脚本文件(微软自带例子若干,后缀.vbs或 .js),
然后用一个程序对他解释执行,这个程序就叫Windows Scripting Host,程序
的名字是Wscript.exe(或者命令行的Cscript.exe),你可以查看一下你的机器
里有没有这两个文件,就知道有没有WSH了。(win2000是在winnt/system32/下)
这非常像批处理文件,只不过文件里不是命令行,而是脚本语言写的脚本。

再来简单介绍一下WSH自带的几个内置对象包括:

1.由 Wscript.exe 提供的对象
Wscript 作为 Wscript 公开给脚本引擎。
WshArguments 未公开;通过 Wscript.Arguments 属性访问。 入

2.由 WSHom.Ocx 提供的对象。
WshShell 自动对象。ProgID 是 Wscript.WshShell。
(注:这个就是我们要用到的,可以执行dos命令)
WshNetwork 自动对象。ProgID 是 Wscript.WshNetwork。
WshShortcut 未公开;通过 WshShell.CreateShortcut 方法访问。
WshUrlShortcut 未公开;通过 WshShell.CreateShortcut 方法访问。
WshCollection 未公开;通过 WshNetwork.EnumNetworkDrives 或 WshNetwork.EnumPrinterConnection 方法访问。
WshEnvironment 未公开;通过 WshShell.Environment 属性访问。
WshSpecialFolders 未公开;通过 WshShell.Folder 属性访问。

他们主要可以完成环境变量的获取,网络登陆,驱动器映射,快截方式创建,
程序加载,特殊文件夹(如系统文件夹)信息获取等功能。

如果你的系统里支持ADO等COM部件,你同样可以使用,
下面这个例子演示打开写字板查看文本文件,同时创建一个文本文件并写入一
段话,你可以把他拷贝到写字板中,然后以.vbs为后缀存盘,之后双击他,

'test.vbs
'*********************
'下面用SHELL对象启动程序
'*********************
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("notepad " & Wscript.ScriptFullName)


'***********************************************
'用COM对象Scripting.FileSystemObject操作文本文件
'***********************************************
Set fs = Wscript.CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:testfile.txt", True)
a.WriteLine("这是一个测试。")
a.Close

也可以在asp等web编程语言中应用
<script  language="VBScript.Encode" runat=server>
'上面用SHELL对象启动程序
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run ("D:winntsystem32cmd.exe" ,1, true)
if IsSuccess = 0 Then
    Response.write " 命令成功执行!"
else 
   Response.write  " 命令执行失败!权限不够或者该程序无法在DOS状态下运行"
end if
</script>
注:
1.其中runat=server必须要有
2.Set WshShell = Wscript.CreateObject("Wscript.Shell")
要改为Set WshShell = server.CreateObject("Wscript.Shell"),
3.参数1代表SW_SHOWNORMAL, 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。
4.TRUE代表返回执行的错误,False或者为指定代表脚本继续执行而不等待进程结束。
5.调用WSH的内置对象了,可以象调用函数和过程一样。
如call WshShell.Run ("D:winntsystem32cmd.exe" ,1, true)

如果你对WSH感兴趣,想了解更多的话,请察看
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsconwshbasics.asp
http://www.dev-club.com/club/bbs/showEssence.asp?id=11136

现在我们言归正传来看看如何对文件进行压缩和解压!
大家都知道winzip对文件解压和压缩都易如反掌,但是如何通过程序和命令行对其调用呢?
当然winzip的作者已经开发出
WinZip Command Line Support Add-On Version 1.0    
大家去可以去http://www.winzip.com/wzcline.htm 下载wzcline.exe!
前提是本机须安装winzip8.0或更高版本的支持,如果你不是winzip8.0,去
http://www.winzip.com/download.htm 下载!

下载后,直接安装就可以!
就会在winzip的目录中产生winzip命令行帮助文件和程序WZZIP.exe,WZUNZIP.EXE。
你可以开始运行里调用:
如:"c:program fileswinzipwzzip"  myfile.zip
也可以拷贝这里两个文件到任意目录下,直接在dos窗口下运行
如:wzzip.exe  myfile.zip
你可以在系统的环境变量里加入set path=c:windows;c:program fileswinzip;
就可以在任何地方不用加入路经调用了!

现在来简单的了解一下帮助中两个命令的基本用法
压缩文件用 WZZIP.exe :
通用格式:wzzip [options] zipfile [@listfile] [files...]
[options]包括:
-a              默认的操作,压缩文件
-a+             压缩文件,并删除要压缩的文件
-b[drive|path]    是在另外的驱动器上创建临时压缩文件
-d              删除zip文件中指定的目标文件
-e<x|n|f|s|0>   是设置压缩比率,x最大,0最小
-f              替换zip文件中存在的文件
-h|-?            察看帮助
-v              创建一个压缩文件的列表信息
-@list             先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名压缩
...............(其他具体看帮助文件)
[@listfile]     是压缩文件的列表信息纪录
[files...]      则是要压缩的多个文件,用空格隔开,也可以用通配符

例:
压缩当前目录的所有文件  
wzzip test.zip *.*
压缩类型为txt的所有文件 
wzzip test.zip *.txt
压缩两个文件           
wzzip test.zip abc.txt def.txt
压缩类型为txt的所有文件除了abc.txt
wzzip -xABC.TXT test.zip *.txt
压缩D:docs下的所有类型为txt的文件及子目录 
wzzip -rp test.zip d:docs*.txt
把zipit.1st里的文件更新到test.zip 
wzzip -u test.zip @Zipit.lst
列出一个压缩文件的列表内容
wzzip -v test.zip

 

解压文件用WZUNZIP.exe :
通过格式:wzunzip [options] zipfile [@listfile] [path] [files...]
[options]包括:
-c[m]            解压是显示文件列表在dos屏幕中
-d              重建zip文件中的目录结构
-f              只解压在zip文件里同目前文件夹存在的同名的文件,如果没有则不解压
-jhrs            忽视zip文件里的文件的隐藏、只读、系统属性
-Jhrs            只解压带有隐藏、只读、系统属性的文件
-n              只解压叫新的文件,如果要解压的文件比已存在的新则替换。
-o              不用通过yes来确定是否要替换文件
-v              创建一个压缩文件的列表信息
-@list            先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名解压
...............(其他具体看帮助文件)
例如:
创建所有文件到当前目录下
wzunzip test.zip
从test.zip中创建abc.txt到当前目录下
wzunzip test.zip abc.txt
创建在test.zip中的目录结构及文件到当前目录下
wzunzip -d test.zip
创建在test.zip中的目录结构及文件到c:docs下
wzunzip -d test.zip c:docs从test.zip中创建包含在files.ist中的文件名的文件
wzunzip test.zip @files.lst
显示test.zip的文件列表内容
wzunzip -v test.zip
显示压缩文件中所有类型为txt的文件列表内容
wzunzip -v test.zip *.txt


有了以上的准备,那么我们现在来编写VBS来执行文件解压和压缩就易如反掌了:
'test.vbs
'*********************
'上面用SHELL对象启动程序
'*********************
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("c:wzzip.exe c:test.zip c:a.txt c:b.txt")


'test.asp
'*********************
'上面用SHELL对象启动程序
'*********************
<script  language="VBScript.Encode" runat=server>
'上面用SHELL对象启动程序
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run (" c:wzzip.exe c:test.zip c:a.txt c:b.txt" ,1, true)
if IsSuccess = 0 Then
    Response.write " 命令成功执行!"
else 
   Response.write  " 命令执行失败!权限不够或者该程序无法在DOS状态下运行"
end if
</script>


怎么样很简单吧,如果我们再把文件上传和此结合起来,就会产生很多使用的功能。如:
在用上传组件上传多个文件后,可以对其多个文件打包,以提供给其他人zip文件下载
或者上传一个zip文件后,可以利用程序对其解压,以提供给其他人单个文件下载
很方便用户吧!我会在以后的文章里把这两种变化写出来!文中难免有疏漏的地方,请大家多多指正!


以上的例子均在win2000+iis5.0上测试过!   一、动态包含文件
本文假定读者已经熟悉HTML、ASP和ActiveX对象的使用。在这里,我们将使用FileSystemObject和TextStream对象实现“动态包含”功能,即实现动态的include指令。
通常我们所设想的动态包含是:用一个变量保存待包含文件的名字,然后把该变量传入include指令。相信我们之中的许多人都曾经想要在自己的ASP应用中使用动态包含的文件,但最终却发现服务器并不直接支持动态包含。
首先应该搞清楚下面的代码是无法实现动态包含的: 
<%
' 声明用来保存文件名字的变量
Dim MyFile
 
' 在变量中保存包含文件的名字
MyFile = Request("SomeFileName")
 
' 将保存有文件名字的变量传递给include指令
%>
<!--#include file=<%=MyFile%>-->
 
上面的代码之所以不能实现动态包含,是因为ASP对include指令的处理早于脚本代码。如果我们执行上述代码,系统将提示错误说找不到包含文件。 
使用包含文件的动机之一是让它作为静态HTML内容的容器,然后通过include指令来引用这个文件。包含文件中的静态HTML通常不作改动,比如标准的页头和页脚。但有些时候我们却需要根据用户的输入或其他条件提供不同的内容。为了不至于为每一种可能的情形分别创建完整的页面,“动态包含”文件这一概念就出现了。然而,正如上面说明的,表面上看起来最为合理的实现方法其实是没有用的。 
为了解决这个问题,我们可以用FileSystemObject对象读入目标包含文件并保存到字符串变量,然后将这个字符串变量插入到发送给客户浏览器的页面。下面这个getFileContents函数帮助实现这个处理过程,它读入参数中指定的文件,然后将其内容作为字符串返回。 
<%
 
' 把文件名字传递给函数
Function getFileContents(strIncludeFile)
Dim objFSO
Dim objText
Dim strPage
 
' 初始化FileSystemObject对象
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'打开文件并把它传递给TextStream对象(objText)。Server对象的
'MapPath函数用于获得文件的物理路径
Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
 
'读取并以字符串形式返回文件内容
getFileContents = objText.ReadAll
 
objText.Close
Set objText = Nothing
Set objFSO = Nothing
End Function
%>
使用这个函数即可实现动态地包含文件。首先,我们读入主页面(即包含页面布局和所有静态内容的模板文件)并把它保存到字符串变量;然后再读入包含文件并保存为字符串变量;最后,把保存包含文件内容的变量插入到主页面的内容之中。 
二、应用实例 
首先我们来看一下模板文件。下面的代码包含了一个HTML注释“<!-- INCLUDE FILE HERE -->”,我们将用包含文件的内容来取代这个HTML注释。 
<html>
<body>
<h2>欢迎到访!</h2>
<table width="500" border="1">
<tr>
<td>
<!-- INCLUDE FILE HERE -->
</td>
</tr>
</table>
</body>
</html>
下面再来看一下本例所用的几个包含文件。第一个包含文件是默认的包含文件。默认包含文件是一个表单,允许用户选择打开其他三个包含文件中的其中一个。注意这个表单没有指定“action”属性,这表示表单将提交给它自己(即重新打开dynamicin3.asp)。 
<!-- BEGIN DEFAULT INCLUDE -->
<form method="post">
<h3>请选择一个您希望打开的文件</h3>
<p>
<select id=cboFile name=cboFile>
<option value="includefile1.inc">文件 #1</option>
<option value="includefile2.inc">文件 #2</option>
<option value="includefile3.inc">文件 #3</option>
</select>
<input type="submit" value="Submit">
</p>
</form>
<!-- END DEFAULT INCLUDE -->
为简单计,其他三个包含文件的内容都很简单: 
<!-- BEGIN INCLUDE FILE #1 -->
<h2 style="color:red">文件 #1 </h2>
<br>
<a href="dynamicinc3.asp">返回默认页面</a>
<!-- END INCLUDE FILE #1 -->
 
<!-- BEGIN INCLUDE FILE #2 -->
<h2 style="color:green">文件 #2 </h2>
<br>
<a href="dynamicinc3.asp">返回默认页面</a>
<!-- END INCLUDE FILE #2 -->
 
<!-- BEGIN INCLUDE FILE #3 -->
<h2 style="color:blue">文件 #3 </h2>
<br>
<a href="dynamicinc3.asp">返回默认页面</a>
<!-- END INCLUDE FILE #3 -->
下面是dynamicinc3.asp页面的代码及其说明。 
<%
'-------------------------------------------------------------
'getFileContents函数放到ASP文件的最前面
'-------------------------------------------------------------
 
'声明存放主页面和包含文件内容的变量
Dim strMain, strInclude
 
'读取主页面的内容并保存到strMain变量
strMain = getFileContents("maintemplate.inc")
 
'检查cboFile选择框是否已经选择。如是,读取所要求的文件
'否则,读取默认的包含文件
If Request.form("cboFile") = "" Then
strInclude = getFileContents("includedefault.inc")
Else
strInclude = getFileContents(Request.form("cboFile"))
End If
 
'把合适的包含文件读入到变量strInclude之后
'使用Replace函数将它插入到strMain文件
strMain = replace(strMain,"<!-- INCLUDE FILE HERE -->",strInclude)
 
'将结果发送到客户端
Response.Write strMain
 
%>
本例能够正常运行,而且从效果上看达到了动态包含文件的目的。但它没有使用include指令,而是使用了FileSystemObject来替代。 
运行这个例子,右击页面并查看源文件,可以发现页面中插入的是默认的包含文件。然后,从选择列表选择一个包含文件。提交表单重新装载页面之后,再查看页面的源文件,可以发现此时插入的是刚才选择的包含文件。
当我们想要分离页面的布局和它的内容时,这种技术是很有用的。我们可以创建描述网站布局的模板,再以包含文件形式制作网站的内容,最后使用ASP就可以方便地把两者结合起来!


     
返回顶部

  OA关键词:如何实现真正的动态包含,asp代码,什么是asp,asp.net教程 OA办公软件 办公自动化 无纸化办公 协同办公系统

  OA信息:[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][22][23]更多>>(后续页1 后续页2 后续页3)
oa系统精选
oa知识相关
联系我们 |惠众地图 |友情连接 电话:400-6866-786 0791-6336981
赣ICP备00565595 版权所有2004-2008 南昌惠众软件有限公司