摘要在基于/的应用环境中上传各种类型的文件一直是困扰用户文件管理应用的难题之一在HTTP中上传文件有三种机制RFCPUT和WebDAV常用的实现方法是利用在RFC中引入的一个新类型File以及ADO Stream对象本文对上述上传方法及实现原理作了论述并给出了具体解决实例
ASP FILE对象
当前基于/模式的应用比较流行当用户需要将文件传输到上时常用方法之一是运行FTP并将每个用户的FTP默认目录设为用户的Web主目录这样用户就能运行FTP客户程序并上传文件到指定的 Web目录这就要求用户必须懂得如何使用FTP客户程序因此这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的 如果我们能把文件上传功能与Web集成使用户仅用Web就能完成上传任务这对于他们来说将是非常方便的但是一直以来由于File System Object的仅能传送文本文件的局限所以ASP最大的难题就是文件上传问题下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传
一通过HTTP上传的三种机制
通过HTTP上传有三种机制RFC PUT 和 WebDAV
PUT 是在HTTP 引入了一个新的HTTP动词当web收到一个HTTP PUT和对象名字它将会验证用户接收HTTP流的内容并把它直接存入web由于这可能会对一个web站点造成破坏并且还会失去HTTP最大的优势可编程性在PUT的情况下自己处理请求没有空间让CGI或者ASP应用程序介入唯一让你的应用程序捕获PUT的方法是在低层操作ISAPI过滤层由于相应的原因PUT的应用很有限
而WebDAV允许web内容的分布式认证与翻译它引入了几种新的HTTP动词允许通过HTTP上传锁定/解锁登记/检验web内容Office 中的Save to web 就是通过WebDAV来实现的如果你所感兴趣的一切都是上传内容WebDAV应用得非常出色它解决了很多问题 然而如果你需要在你的web应用程序里面上传文件WebDAV对你就毫无用处可言象HTTP PUT一样那些WebDAV的动词是被解释的而不是web应用程序你需要工作在ISAPI过滤层来访问WebDAV的这些动词并在你的应用程序中解释内容
RFC () 最终被WC在HTML中接受前是作为一种建议标准它是一种非常简单但是功能很强大的想法在表单字段中定义一个新类型<INPUT TYPE=FILE>
并且在表单本身加入了不同的编码方案不再使用典型的<FORM ACTION=formprocasp METHOD=POST>
而是使用
<FORM ACTION=formprocasp METHOD=POST ENCTYPE=multipart/formdata>
这种编码方案在传送大量数据的时候比起缺省的application/xurlencoded表单编码方案显得效率要高得多URL编码只有很有限的字符集使用任何超出字符集的字符必须用%nn代替这里的nn表示相应的个十六进制数字例如即使是普通的空格字符也要用%代替而RFC使用多部分MIME编码就象通常在email消息中看到的那样不编码来传送大量数据而只是在数据周围加上很少的简单但实用的头部主要的厂商都采用了建议的浏览……按钮用户能很容易的使用本地打开文件…… 对话框选择要上传的文件
RFC仍然将大多数文件上传的灵活方法留给了你的web应用程序PUT用得很有限WebDAV对内容的作者很有用比如FrontPage用户但是对想在web应用程序中加入文件上传的web开发者来说很少用到因此RFC是在web应用程序中加入文件上传的最好的办法
在实际应用中免费提供了Posting Acceptor ASP不懂multipart/formdata 编码方案取而代之提供了Posting Acceptor Posting Acceptor是一种在上传完成后接受REPOST到一个ASP页的ISAPI应用程序
Software Artisans的SAFileUp是最早的商业Active Server之一几经改进现在作为一个纯粹的ASP存在
二基于ASP的文件上传实现原理分析
基本原理是采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出从中截取出所需的文件数据以二进制文件方式存盘
下面是上传文件页面的一个例子()<html>
<body>
<form name=Upload Method=Post Enctype=multipart/formdata
Action=Uploadasp>
<input type=file name=FileName>
<INPUT TYPE=Submit VALUE=Upload></TD>
</form>
</body>
</html>
程序中使用了文件对象
这样在Upload
asp中采用BinaryRead方法读来的原始数据就不仅仅是选择的文件本身的数据
还包含该文件在用户硬盘上的路径
类型
提交页面的表单等相关信息的描述
这样我们就需从中提取出文件的具体内容
根据分析
数据的头部信息与数据的分界线是两对回车换行符
尾部也有分隔信息
我们可以采用类似以下的方法获取文件数据
Dim FormDataFormSizeDataStartCLStrDivStr
FormSize=RequestTotalBytes
FormData=RequestBinaryRead(FormSize)
CLStr=ChrB()&ChrB()
DataStart=InStrB(FormDataCLStr&CLStr)+
是两对回车换行符的长度
DivStr=LeftB(FormDataInStrB(FormDataCLStr))
DataSize=InStrB(DataStart+FormDataDivStr)DataStart
FormData=MidB(FormDataDataStartDataSize)
FormData就是文件的内容了
中间根据需要可进行相应的处理最后的工作就是将文件保存了保存的方法可以有两种一种是利用VB或VC之类程序中的二进制文件操作方法在工程中加入适当的类型库最终编译成DLL文件使用时再将该DLL文件注册就可以了文件存贮程序如下
Public Function SaveFile(Pathname As String) As String
Dim objContext As ObjectContext
Dim objRequest As Request
Set objContext=GetObjectContext()
Set objRequest=objContext(Request)
以下的一段代码是进行文件存贮的有关操作
Dim FormData() As ByteCLStrDivStr
Dim DataStart As LongDataSize As Long
DataSize=objRequestTotalBytes
Redim FormData(DataSize)
FormData=objRequestBinaryRead(DataSize)
CLStr=ChrB() & ChrB()
DataStart=InStrB(FormDataCLStr & CLStr)+
DivStr=LeftB(FormDataInStrB(FormDataCLStr))
DataSize=InStrB(DataStart+FormDataDivStr)DataStart
FormData=MidB(FormDataDataStartDataSize)
创建一个二进制文件并将FormData写入其中
Open Pathname For Binary As
Put #FormData
Close #
SaveFile=OK!
End Function 第二种方法是利用ADO STREAM中提供的二进制文件操作方法来完成保存文件的语句是 StreamOBJSaveToFile (fileName)在 这种操作中我们可以将有关的操作存放在一个类文件中在应用时直接将该类文件包含在ASP程序中就可以了具体处理方法请参阅有关介绍
三.文件上传实现方法实例实现文件上传可使用或无方式对于类比如说microsoft posting acceptor(简称mpa)就是公司发布的一个免费这类的安装也比较方便对于的mpa运行它的安装文件就可以了而一般的dll形式的我们则需要进行注册例如要使用aspcnUPdll只要在Window 上执行regsvr [path\]aspcnUPdll系统出现注册成功的信息提示就可以使用该了对于无类如的无上传类upload_xsoft在使用时只要在处理程序中包含以下的语句就可以了
<!#include FILE=uploadinc>
set upload=new upload_xSoft 建立上传对象
有关的属性与操作方法请参阅该的使用手册
下面是詀spcnUPdll为例上传部分类型文件的源代码(uploadasp)<% @ language=vbscript
Set fileUP=ServerCreateObject(aspcnUpload)
fileUPMaxsize=
fileUPPath=d:\upfile
fileUPUpload
For i= to fileUPCount
fieldname=fileUPFieldName(i)
If fileUPFileType(fieldname)=zip Or ileUPFileType(fieldname)=rar
Then
fileUPSave fieldname
End If
Next
Set fileUP=Nothing
%>
四.结束语
应用模式还在快速地发展着在ASP.NET中已经内置了文件上传的功能使用非常简单方便作为一种全新的技术ASP.NET并不只是ASP的简单升级它是一个用于Web开发的全新框架其中包含了许多新的特性ASP.NET提供了更易于编写结构更清晰的代码利用这些代码我们将会更容易地进行再利用和共享从而开发出更多更实用的程序来