`
luliangok
  • 浏览: 783750 次
文章分类
社区版块
存档分类
最新评论

asp组件上传---------之一

 
阅读更多

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程序中就可以了。具体处理方法,请参阅有关介绍。

分享到:
评论

相关推荐

    风声 ASP 无组件上传类 V2.11 [Fonshen ASP UpLoadClass Version 2.11]

    风声 ASP 无组件上传类 是当前效率最高的ASP无组件上传程序之一。  风声 ASP 无组件上传类 自其V1.0发布就有自己鲜明的特点——易用;V1.02功能进一步加强,并且奠定了其在同类程序中高效率的地位;V2.0秉承其易用...

    风声无组件上传类 v2.1

    『风声无组件上传类』是当前效率最高的ASP无组件上传程序之一。  『风声无组件上传类』自其V1.0发布就有自己鲜明的特点——易用;V1.02功能进一步加强,并且奠定了其在同类程序中高效率的地位;V2.0秉承其易用高效...

    风声无组件上传类 V2.11

    当前效率最高的ASP无组件上传程序之一  自定义上传文件格式限制;自定义上传总大小、单文件大小限制;自动无重复命名批量/单个保存;自动源文件名批量/单个保存;自定义文件名保存;图片/flash文件识别宽高;多...

    免费友情链接网自动收录

    1.删除新闻发布的上传组件,因为一些杀毒软件误报,以免给大家带来误会! 2.删除一些无法访问的网站,导入新收录的一些新站! 3.后台添加网址时加入网站LOGO,站长QQ等信息! 4.LOGIN.asp提交网址页,加了网站名称,和网址...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。 -下载后解压zip包,将commons-...

    《ASP.NET与数据库程序设计》

    3-1-2上传文件 3-1-3动态产生表格列及单元格 3-2 WebControl 3-2-1使用月历执行查询 3-2-2使用验证规则 3-2-3使用组合方块 3-2-4使用选项组 3-2-5取得及显示控制项之值 3-3事件处理 ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    smartuploader多文件上传组件汉化版

    一个好用的基于flash的多文件上传组件,修改了一些功能,使之更符合国人习惯,支持php及asp.net

    网络程序设计:ASP.rar

    关于动态网页设计,目前有很多技术,之所以选择ActiveServerPages(ASP),主要是因为它简单、易学、实用。 出版以来,受到了广大读者的认可和欢迎,很多读者也给我提出了很多很好的建议。为了答谢大家对我的厚爱,...

    [ASP]xiaoshuoguanli整站系统

    本人仅业余学习一些基础的ASP知识以供系统设计之用,并非专业人员,相关服务器设置、MSSQL/MySQL数据库方面的专业问题请自行解决。 本人仅提供本系统相关的一些技术问题的解释、解答。 运行环境: 服务器需要: ...

    SnSitesV1.0.1共享版本

    11,超强的商业组件控制功能.(仅限ISP专业版) SnSites V1.0.0 -------------------- 前台功能区(I) -------------------- I1-1,自动判断访问者机器语言; I1-2,精确定位来访者的前后动作与状态. I1-3,任意页...

    ASP在线作业系统

    class.asp中改了一个错别字“只有”,改为“只要”在admin_explain.asp中改了一个错别字“介”改为“但”在add_homework.asp中加入了老师上传文件的功能,引用了无惧上传类2.0,加入两个文件control/upload_class....

    JSP2.0技术手册pdf(带示例源码).zip

    9-4 文件上传—— Oreilly 上传组件 9-5 jspSmartUpload ——上传和下载 9-6 本文区输入类型(Textarea) 第十章 Session Tracking 10-1 Stateful & Stateless 10-2 Session Tracking 的四种方法 10-3 Session 的生命...

    2345导航网源码完美版 v8.3.rar

    一如既往纯净、完整、无插件、无乱码、一比一完美精仿,界面整洁,完全免费。绿色源码,占用空间小、轻巧,访问速度快,傻瓜式免安装,上传即可使用,个人轻松建站。   导航功能含有:日期、农历,天气预报,常用...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    、上传组件选择(关闭、无组件上传类、Aspupload3.0组件、SA-FileUp 4.0组件、DvFile-Up V1.0组件),点击选择根据提示文字选择允许的组件。一般选择Aspupload为上传组件! 、生成预览图片组件(关闭、...

    应该在BorCon上做完的几个DEMO

    1. 使用FCL/VCL下的组件设计与ASP.NET下的组件设计器的相似性对照--------ASP.NET.User.Control.DemoDEMO.aviUser.Control.DemoDEMO.avi--------在两种方式下设置组件的操作是大致相同的。在User.Control.Demo这个...

    计算机软件毕业设计-网上贴吧系统-计算机毕业设计源码-计算机毕业设计源代码.rar

    随着网络技术的飞速发展,贴吧已经成为网络上不可缺少的交流方式之一,深受网民的喜爱。整个贴吧系统使用Browser/Web模式来设计,服务器端采用Access数据库系统和ASP组件来构成贴吧系统;客户端采用浏览器来完成...

    毕业设计:ASP理发管理系统设计(源代码)

    ASP是目前流行的Web应用开发技术之一,用于构建Windows服务器平台上的Web应用程序。ASP页是一种动态网页,其主要特点是它可以包含服务器端脚本,而且可以使用一些内置对象来增强脚本的功能,还可以调用组件对象模型...

    vc代码合集

    2012-06-11 09:50 3,412,722 内部文件非内部程序员禁止访问谢谢1234567890123456789能够实现文件的多选,统一上传,从而实现文件的批量上传Flex多文件上传源码VS2005.rar 2012-06-11 10:08 1,481,225 几个C语言小...

    H5智能内核-基于MVC架构的全新Zoomla!逐浪CMS2 x3.8发布

    众所周知,目前面向云与大数据是今天互联网的大势所趋,而MVC框架则是目前最流行的开发框架之一。 ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。 ASP.NET 支持三种不同的开发...

Global site tag (gtag.js) - Google Analytics