电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> ASP
ASP中实现文件上传方法的研究-ASP教程,ASP应用
作者:网友供稿 点击:21
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
摘要:在基于浏览器/服务器的应用环境中,在浏览器中上传各种类型的文件一直是困扰用户文件管理应用的难题之一。在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提供了更易于编写、结构更清晰的代码,利用这些代码我们将会更容易地进行再利用和共享,从而开发出更多更实用的程序来。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·如何使XP的目录属性出现"安全"选项-ASP教程,系统相关
·创建有个性的对话框之MFC篇(二)-ASP教程,系统相关
·用InstallShield打包ASP程序-ASP教程,ASP应用
·windows server 2003 中 SQL Server 2000 分布式事务 错误解决方法-ASP教程,系统相关
·创建有个性的对话框之MFC篇(一)-ASP教程,系统相关
·DevExpress打印相关代码-ASP教程,打印相关
·File文件控件,选中文件(图片,flash,视频)即立即预览显示-ASP教程,组件开发
·用Windows的文件映射机制,实现大批量数据的快速存储-ASP教程,系统相关
·ADO如何取得数据库中表的字段信息之一
·使用DEVEXPRESS部件打印时标题的处理-ASP教程,打印相关

最新文章
· SQL注入天书 - ASP注入漏洞全接触
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·如何实现ASP.NET网站个性化
·关于ASP.NET调用JavaScript的实现
·ASP利用Google实现在线翻译功能
·Asp无组件生成缩略图
·由HTTP 500 Internal server error想到的...
·实例讲解asp抓取网上房产信息
·改mdb为asp所带来的灾难


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号