快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

ASP中实现文件上传方式的研究

 摘要:在基于浏览器/服务器的应用环境中,在浏览器中上传各种类型的文件一直是困扰用户文件治理应用的难题之一。在HTTP中上传文件有三种机制:RFC1867,PUT和WebDAV。常用的实现方式是利用在RFC1867中引入的一个新类型:File以及ADO Stream对象。本文对上述上传方式及实现原理作了论述,并给出了详细解决实例。

  要害词:ASP 组件 FILE对象

  当前,基于浏览器/服务器模式的应用比较流行。当用户需要将文件传输到服务器上时,常用方式之一是运行FTP服务器并将每个用户的FTP默认目录设为用户的Web主目录,这样用户就能运行FTP客户程序并上传文件到指定的 Web目录。这就要求用户必须懂得如何使用FTP客户程序。因此,这种解决方案仅对认识FTP且富有经验的用户来说是可行的。 假如我们能把文件上传功能与Web集成,使用户仅用Web浏览器就能完成上传任务,这对于他们来说将是异常方便的。但是,一直以来,由于File System Object的仅能传送文本文件的局限,所以ASP最大的难题就是文件上传问题。下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传。

  一.通过HTTP上传的三种机制

  通过HTTP上传有三种机制:RFC1867, PUT 和 WebDAV。

  PUT 是在HTTP 1.1引入了一个新的HTTP动词。当web服务器收到一个HTTP PUT和对象名字,它将会验证用户,接收HTTP流的内容,并把它直接存入web服务器。由于这可能会对一个web站点造成破坏,并且还会失去HTTP最大的优势:服务器可编程性。在PUT的情况下,服务器自己处理哀求:没有空间让CGI或者ASP应用程序介入。唯一让你的应用程序捕捉PUT的方式是在低层操作,ISAPI过滤层。由于相应的原因,PUT的应用很有限。

  而WebDAV答应web内容的分布式认证与翻译。它引入了几种新的HTTP动词,答应通过HTTP上传,锁定/解锁,登记/检验web内容。Office 2000中的"Save to web" 就是通过WebDAV来实现的。假如你所感爱好的一切都是上传内容,WebDAV应用得异常精彩,它解决了很多问题。 然而,假如你需要在你的web应用程序里面上传文件,WebDAV对你就毫无用处可言。象HTTP PUT相同,那些WebDAV的动词是被服务器解释的,而不是web应用程序。你需要工作在ISAPI过滤层来访问WebDAV的这些动词,并在你的应用程序中解释内容。

  RFC1867 (http://www.ietf.org/rfc/rfc1867.txt) 最终被W3C在HTML3.2中接受前,是作为一种建议标准。它是一种异常简朴但是功能很强盛的想法:在表单字段中定义一个新类型。

<INPUT TYPE="FILE">

  并且在表单本身加入了不同的编码方案,不再使用典型的:

<FORM ACTION="formproc.asp" METHOD="POST">

  而是使用:

<FORM ACTION="formproc.asp" METHOD="POST" ENCTYPE="multipart/form-data">

  这种编码方案在传送大量数据的时候,比起缺省的"application/x-url-encoded"表单编码方案,显得效率要高得多。URL编码只有很有限的字符集,使用任何超出字符集的字符,必须用\\\'%nn\\\'代替,这里的nn表示相应的2个十六进制数字。例如,即使是普通的空格字符也要用\\\'%20\\\'代替。而RFC1867使用多部分MIME编码,就象通常在e-mail消息中看到的那样,不编码来传送大量数据,而只是在数据四周加上很少的简朴但实用的头部。主要浏览器的厂商都采用了建议的"浏览..."按钮,用户能很轻易的使用本地"打开文件..." 对话框选择要上传的文件。

  RFC1867仍旧将大多数文件上传的灵活方式留给了你的web应用程序。PUT用得很有限。WebDAV对内容的作者很有用,比如FrontPage用户,但是对想在web应用程序中加入文件上传的web开发者来说很少用到。因此,RFC1867是在web应用程序中加入文件上传的最好的办法。

  在实际应用中,微软免费提供了Posting Acceptor 。ASP不懂"multipart/form-data" 编码方案。取而代之,微软提供了Posting Acceptor ,Posting Acceptor是一种在上传完成后,接受REPOST到一个ASP页的ISAPI应用程序。

  Software Artisans的SA-FileUp是最早的商业Active Server组件之一。几经改进,现在作为一个纯粹的ASP组件存在。

  二.基于ASP的文件上传实现原理分析

  基本原理是:采用ADO Stream对象的BinaryRead方式将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方法存盘。

  下面是上传文件页面的一个例子(upload.htm):

<html>
<body>
<form name="Upload" Method="Post" Enctype="multipart/form-data" Action="Upload.asp">
<input type="file" name="FileName">
<INPUT TYPE="Submit" VALUE="Upload"></TD>
</form>
</body>
</html>

  程序中使用了文件对象,这样在Upload.asp中采用BinaryRead方式读来的原始数据就不仅仅是选择的文件本身的数据,还包含该文件在用户硬盘上的路径、类型、提交页面的表单域名等相关信息的描述,这样我们就需从中提取出文件的详细内容。根据分析,数据的头部信息与数据的分界线是两对回车换行符,尾部也有分隔信息,我们可以采用类似以下的方式获取文件数据。

Dim FormData.FormSize,DataStart,CLStr,DivStr
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize)
CLStr=ChrB(13)&ChrB(10)
DataStart=InStrB(FormData.CLStr&CLStr)+4
\\\'4是两对回车换行符的长度
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)
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 Byte,CLStr,DivStr
    Dim DataStart As Long,DataSize As Long
    DataSize=objRequest.TotalBytes
    Redim FormData(DataSize-1)
    FormData=objRequest.BinaryRead(DataSize)
    CLStr=ChrB(13) & ChrB(10)
    DataStart=InStrB(FormData,CLStr & CLStr)+4
    DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
    DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
    FormData=MidB(FormData,DataStart,DataSize)
    \\\'创建一个二进制文件并将FormData写入其中
    Open Pathname For Binary As 1
    Put #1,,FormData
    Close #1
    SaveFile="OK!"
   End Function

  第二种方式是利用ADO STREAM中提供的二进制文件操作方式来完成,保存文件的语句是: StreamOBJ.SaveToFile (fileName,2)。在 这种操作中,我们可以将有关的操作存放在一个类文件中,在应用时,直接将该类文件包含在ASP程序中就可以了。详细处理方式,请参阅有关介绍。

  三.文件上传实现方式实例

  实现文件上传可使用组件或无组件方法。对于组件类,比如说microsoft posting acceptor(简称mpa),就是微软公司发布的一个免费服务器组件,这类组件的安装也比较方便。对于微软的mpa,运行它的安装文件就可以了。而一般的dll组件形式的,我们则需要进行注册。例如,要使用aspcnUP.dll,只要在Window 2000上执行regsvr32 [path]aspcnUP.dll,系统出现注册成功的信息提示就可以使用该组件了;对于无组件类,如www.5xsoft.com的无组件上传类-upload_5xsoft。在使用时,只要在处理程序中包含以下的语句就可以了:

<!--#include FILE="upload.inc"-->
set upload=new upload_5xSoft \\\'建立上传对象

  有关的属性与操作方式,请参阅该组件的使用手册。

  下面是以aspcnUP.dll组件为例,上传部分类型文件的源代码(upload.asp):

<% @ language="vbscript"
 Set fileUP=Server.CreateObject("aspcn.Upload")
 fileUP.Maxsize=200000
 fileUP.Path="d:upfile"
 fileUP.Upload
 For i=0 to fileUP.Count
  fieldname=fileUP.FieldName(i)
  If fileUP.FileType(fieldname)="zip" Or ileUP.FileType(fieldname)="rar" Then
   fileUP.Save fieldname
  End If
 Next
 Set fileUP=Nothing
%>

  四.结束语

  浏览器/服务器应用模式还在迅速地发展着,在微软新推出的ASP.NET中,已经内置了文件上传的功能,使用异常简朴方便。作为一种全新的技术,ASP.NET并不只是ASP的简朴升级,它是一个用于Web开发的全新框架,其中包含了许多新的特性。ASP.NET提供了更易于编写、结构更清楚的代码,利用这些代码我们将会更轻易地进行再利用和共享,从而开发出更多更实用的程序来。
返回类别: 教程
上一教程: 一个判定SESSION是否过期的小技巧
下一教程: 制作我们自己的EBAY(拍卖系统)(7)

您可以阅读与"ASP中实现文件上传方式的研究"相关的教程:
· 使用ASP实现文件上载(上传)的各种方式
· 使用ASP实现文件上载(上传)的各种方式
· 利用ASP技术实现文件直接上传功能
· ASP文件上传原理分析及实现实例
· 无组件实现文件上传/下载
    微笑服务 优质保证 索取样品