栏目→电脑→程序设计→ASP/ASP+→
编写功能完备的ASP文件上载组件
——对“编写Web方式上载文件的ASP组件”一文的补充
中国人民武装警察部队学院
马民
黄明建的“编写Web方式上载文件的ASP组件”(以下简称原文)一文从RFC1867标准出发,分析了上传的二进制文件格式,编写出了具有文件上载功能的ASP组件,突破了多以Perl语言来实现WEB方式上载文件的方法。但原文忽略了以下几个关键问题:
按照RFC1867标准,上载的文件可以更换新名。在原文的demo.htm中,文本框text1即起到保存新文件名的作用。原文却忽略了这一点,使得text1成为一个并无实际意义的元素;
ActiveX代码部件(ASP组件)的接口函数(类的公有成员函数)是强类型检查,即必须指定形参的具体数据类型而不能使用自动类型(Variant);但在ASP环境中,所有的变量实际上都是Variant类型,如何使ASP的变量可以作为ASP组件接口函数的实参将关系到ASP组件是否具有实际的应用价值。原文也忽略了这一技术要点;
ASP组件毕竟是基于服务器端的,诸如空提交等的验证应首先在客户端采用VBScript/JavaScript来完成,以避免无用信息的传递。
基于以上几点,本文首先升级了原文的ASP组件版本,使其成为一个功能完备的ASP文件上载组件。
现将原文ASP组件中接口的规范说明总结如下:
1、 功能:取得提交表单中元素的值;
方法名:GetTheValue;
形参:提交表单中元素名称,nm(数据类型:字符串);
返回值:成功,则为指定的元素在提交表单中的值(数据类型:字符串);
--- 失败,则返回零长度字符串。
2、 功能:保存上载文件
方法名:SaveTheFile
形参:1、提交表单中文件类型元素名称,strTag(数据类型:字符串);
- 2、保存目标文件的绝对路径,末尾不带“/”,strPath(数据类型:字符串);
返回值:成功,则为保存的目标文件名(数据类型:字符串);
--- 失败,则返回零长度字符串。
本文升级的ASP组件与原文的ASP组件保持二进制兼容,即保留了原版本的全部接口,并增加了增强的接口,其规范说明如下:
3、 功能:增强型保存上载文件,建议不再使用方法SaveTheFile
方法名:ExSaveTheFile
形参:1、提交表单中文件类型元素名称,strTag(数据类型:字符串);
- 2、保存目标文件的绝对路径,末尾不带“/”,strPath(数据类型:字符串);
- 3、保存的目标文件名(支持长文件名),strDesFileName(数据类型:字符串);
此参数可选参数,未指定时,以源文件名作为目标文件名;
返回值:成功,则为保存的目标文件名(数据类型:字符串);
--- 失败,则返回零长度字符串。
在ASP上载文件组件的新版本中,调用方法ExSaveTheFile如忽略可选取参数strDesFilename,则可以实现与方法SaveTheFile相同的功能;选取参数时,目标文件名既可以是用户指定的新文件名,也可以根据用户ID或cookie及数据库中的信息来生成,具有较强的实际应用价值。
值得一提的是,在ActiveX DLL工程属性中应设置版本的二进制兼容并选择一个合适的基地址;另外,VB6提供一个打包和展开向导(Package & Deployment Wizard)用于将ActiveX部件打包成CAB文件并可部署到远程IIS服务器上。
其次,解决ASP编程中调用ActiveX部件的参数类型匹配问题。由于ASP环境中变量都是Variant类型,直接以之作为ASP上载文件组件的实参就会产生类型不匹配的错误。根据笔者的经验和对ActiveX部件的反复测试,找到了以下解决方法:
如果VarPara是ASP环境中的变量,则“” & VarPara可以匹配用VB编写的ActiveX部件中string数据类型。
基于客户端的验证只是一个实现策略上的问题,可直接参考下面的例子(新ASP文件上载组件的全限定名改为UpLoad.UploadFile):
示例文件upload.htm 和 示例文件upload.asp,可在此下载。
以上例子在VB 6.0和IIS 4.0下测试通过。
示例文件upload.htm
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>ASP文件上载组件示例</TITLE>
</HEAD>
<BODY>
<DIV align=center>
<script language="JavaScript">
function validate(TheForm)
{
var x=TheForm.file1.value;
if ( x.length < 1 ){
alert("请输入上载的文件!"
;
TheForm.file1.focus();
return false;}
else
return true;
}
</script>
</DIV>
<DIV align=center>
<FORM method="post" enctype="multipart/form-data" action="upload.asp" onsubmit="return validate(this)">
<DIV >ASP文件上载组件示例</DIV>
<P >保存到W3SVR的文件新名:
<INPUT id=text1 name=text1> (空则与源文件同名)<BR> 上载的文件:
<INPUT id=file1 name=file1 type=file><BR><INPUT id=submit1 name=submit1 type=submit value=上载> <INPUT id=reset1 name=reset1 type=reset value=重置></P>
</FORM></DIV>
</BODY>
</HTML>
示例文件upload.asp
<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
dim strPath,strDes
Set UploadObj = Server.CreateObject("UpLoad.UploadFile"
'指定目标文件路径
strPath="d:/inetpub/wwwroot/project6/images"
strDes = UploadObj.GetTheValue("text1"
Response.Write( "指定的新文件名是: " & strDes)
Response.Write "<p>选择的文件已经上载到服务器!"
if ( strDes = "" ) then
'未指定目标文件名,以源文件名作为目标文件名,等同方法SaveTheFile
UploadObj.ExSaveTheFile "file1", "" & strPath
else
'以用户指定的新文件名作为目标文件名
UploadObj.ExSaveTheFile "file1", "" & strPath, UploadObj.GetTheValue("text1"
'使用以下方法亦可
UploadObj.ExSaveTheFile "file1", "" & strPath, "" & strDes
end if
%>
</BODY>
</HTML>
特别感谢『九头鸟』自发编辑『 dy 』| |