ASP无组件上传·从原理剖析到实践(下)

上传|无组件

第七天:实现附加功能

今天,我们就来实现昨天提出的方法和属性,来完善我们的文件上传类。以前没有太注意的性能问题,这一次也要彻底的解决:
1。所有的变量先声明,后使用;
2。设置类的teminate方法;
3。简化有些地方的写法,注意细节。
我们的原则,就是先实现,后优化。当然,象变量声明这样的东西,如果程序很大,最好还是在写程序的时候一次过。如果写完了才加,可以在页面开头加上option explicit(强制变量声明),然后测试所有的方法和属性,直到没有错误为止。

另外,异常代码我们也整理一下:
代码 类名 类型 描述
==============================================================================
11 FormElement IndexOutOfBound 表单元素子集索引越界
12 FormElement IllegalArgument 非法的表单元素子集索引
21 UploadRequest IndexOutOfBound 文本元素索引越界
22 UploadRequest IllegalArgument 非法的文本元素索引
23 UploadRequest IndexOutOfBound 文件元素索引越界
24 UploadRequest NullRef 文件元素索引不存在
25 UploadRequest IllegalArgument 非法的表单元素索引
26 UploadRequest TooLargeFile 文件%fldname尺寸过大
27 UploadRequest TooLargeFiles 文件总尺寸过大
28 UploadRequest InvalidFileType 文件%fldname类型错误

好了,下面的,就是我们的整个实现了:
1。com.2yup.util.uploadrequest.class
<%
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 没有版权,欢迎拷贝或是作为商业用途。
' 如果要转载,能注明出处最好,我们会很感激您的支持;如果不方便,就算了,呵呵。
' 感谢各位常来2yup的网友(很多名字,写不下了,呵呵)长期热情的支持,
' 你们是我持久的动力。
'
' 关于这个组件的详细信息,以及编程的全过程,可以来
' http://www.2yup.com/asp
' 的文档中心看个究竟。有任何疑问,欢迎来我们的论坛讨论,或是给我发email:
' miles2yup@hotmail.com
' ---- Miles [Yup Studio] ^ ^
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'=========================================================================
'' 这个,是存储文本域信息的的类。每一个name的文本域,对应一个这样的类。
'=========================================================================
Class FormElement

' m_开头,表示类成员变量。
Private m_dicItems

Private Sub Class_Initialize()
Set m_dicItems = Server.CreateObject("Scripting.Dictionary")
End Sub

' set nothing时激发。清理资源
Private Sub Class_Terminate()
Set m_dicItems = Nothing
End Sub

' count是咱们这个类的一个只读属性
Public Property Get Count()
Count = m_dicItems.Count
End Property

' Value是一个默认属性。目的是得到值
Public Default Property Get Value()
Value = Item("")
End Property

' Name是得到文本域名称。就是<input name=xxx>里的xxx
Public Property Get Name()
Dim Keys
Keys = m_dicItems.Keys
Name = Keys(0)
Name = left(Name,instrrev(Name,"_")-1)
End Property

' Item属性用来得到重名表单域(比如checkbox)的某一个值
Public Property Get Item(index)
Dim Items, i
If isNumeric(index) Then '是数字,合法!
If index > m_dicItems.Count-1 Then
err.raise 11,"IndexOutOfBound", "表单元素子集索引越界"
End If
Items = m_dicItems.Items
Item = Items(index)
ElseIf index = "" Then '没给值?那就返回所有的!逗号分隔
Items = m_dicItems.Items
For i = 0 to m_dicItems.Count-1
If i = 0 Then
Item = Items(0)
Else
Item = Item & "," & Items(i)
End If
Next
Else '给个一个不是数字的东东?出错!
err.raise 12,"IllegalArgument", "非法的表单元素子集索引"
End If
End Property

Public Sub Add(key, item)
m_dicItems.Add key, item
End Sub

End Class

'=========================================================================
'' 这个,是存储文件域信息的的类。每一个name的文件,对应一个这样的类。
'=========================================================================
Class FileElement

' m_开头,表示类成员变量。
Private m_strName
Private m_bData
Private m_bRawData
Private m_strContentType
Private m_strFilePath
Private m_strFileName
Private m_lSize

' Data是一个默认属性。目的是得到值
Public Default Property Get Data()
Data = m_bData
End Property

' 这个属性很尴尬——stream对象write方法要求的数据类型是
' "A Variant that contains an array of bytes to be written."
' 但是我却无法从一个二进制串中得到这个数据类型!的确很奇怪。所以,我打算
' 使用符合要求的原始数据m_bRawData。但是,vbs的类功能少得可怜,既不能传递
' 当前对象的引用来回访UploadRequest的m_bRawData也不能用inner class的方
' 法进行组织。为了保持方法的简洁,所以加了这个只写的RawData属性。
' 这个地方很值得改进。
Public Property Let RawData(data)
m_bRawData = data
End Property

' Name是得到文件域名称,就是<input type=file name=xxx>里的xxx
Public Property Get Name()
Name = m_strName
End Property

' ContentType是得到文件contentType
Public Pro

时间: 2025-01-21 11:11:05

ASP无组件上传·从原理剖析到实践(下)的相关文章

ASP无组件上传·从原理剖析到实践(上)

上传|无组件 无组件上传一直是困扰大家的一个问题.其实原理很简单,核心就是分析字符串.但是,实际操作时,却困难重重.其中的关键问题还是大家往往对原理的剖析不够深入,或者是因为过程过于繁琐,导致bug不断.一直以来,都想做一个完善的例子,只不过想想就头痛,加上没时间(借口,呵呵 ),所以没有付诸行动. 今天就咬咬牙,给大家提供一个完整的无组件上传的例子.因为本人耐性不好,所以咱们一点一点来,分几天完成.未来的几天,我会天天更新这个文档,这个过程也是大家学习和提高的过程. (完整的源码和示例,可以在

ASP无组件上传·从原理剖析到实践(中)

上传|无组件 第五天:得到文件单元 今天我们要进行的部分,是比较有趣味性地--得到文件内容.其实,看看我们的要处理的数据,再看看前天文本单元的处理,相信大家也会心中有数. 为了清晰的区分文件和文本单元,这一次,我们用ourRequest.file(index)来对应文本单元的ourRequest.form(index).当然,因为对于文件,我们需要得到的信息不同于文本,所以这次得到的,也不会是FormElement,而是一个新对象FileElement. 文件单元和文本单元在原始数据上,不同点少

ASP无组件上传?从原理剖析到实践(下)

第七天:实现附加功能今天,我们就来实现昨天提出的方法和属性,来完善我们的文件上传类.以前没有太注意的性能问题,这一次也要彻底的解决:1.所有的变量先声明,后使用:2.设置类的teminate方法:3.简化有些地方的写法,注意细节.我们的原则,就是先实现,后优化.当然,象变量声明这样的东西,如果程序很大,最好还是在写程序的时候一次过.如果写完了才加,可以在页面开头加上option explicit(强制变量声明),然后测试所有的方法和属性,直到没有错误为止.另外,异常代码我们也整理一下:代码 类名

ASP无组件上传?从原理剖析到实践(中)

第五天:得到文件单元今天我们要进行的部分,是比较有趣味性地--得到文件内容.其实,看看我们的要处理的数据,再看看前天文本单元的处理,相信大家也会心中有数.为了清晰的区分文件和文本单元,这一次,我们用ourRequest.file(index)来对应文本单元的ourRequest.form(index).当然,因为对于文件,我们需要得到的信息不同于文本,所以这次得到的,也不会是FormElement,而是一个新对象FileElement.文件单元和文本单元在原始数据上,不同点少得可怜:1.第一行多

asp无组件上传算法的改进

上传|算法|无组件 前几天帮朋友faintbear修改一个"asp无组件上传"的代码,得了几点心得,写在此处,或许还有点用处. 我没有开发过asp程序,只是临时报佛脚,修改了一下控制语句,所以,这里不再给出asp代码,只是说明一下思路.(你最好在看这篇文章前先浏览一下faintbear的<asp无组件上传的原理 (转) >这篇文章,重复的部分我不再叙述了) 大体是这样的,一个form表单中可能post多个文本,居各简单的例子:<form method="po

Asp无组件上传带进度条(续)

上传|无组件 几个月前,写过一篇关于Asp无组件上传带进度条的Blog,当时主要分析了一下通过Web文件上传并在后台获取分析数据的实现原理.其中实现进度条的根本就是要实现分块获取数据,根据分块大小和块数记录已上传大小.还有一些具体的细节问题当时并没有说清楚: Q: 进度信息如何访问?A: 进度信息保存在Application中,每次上传时生成一个进度ID,根据这个进度ID可以检索Application中的当前上传进度信息. Q: 进度信息以什么形式保存在Application中?A: Asp太弱

Asp无组件上传进度条解决方案

解决|上传|无组件 一.无组件上传的原理我还是一点一点用一个实例来说明的吧,客户端HTML如下.要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data": <form method="post" action="upload.asp" enctype="multipart/form-data&q

Asp无组件上传进度条解决方案_应用技巧

一.无组件上传的原理我还是一点一点用一个实例来说明的吧,客户端HTML如下.要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data": <form method="post" action="upload.asp" enctype="multipart/form-data">&l

ASP实例:一个简单的ASP无组件上传类

简单的ASP无组件上传类,发出来让大家看看.可以做做实验! 以下为引用的内容: <%@ language="javascript"%><%var self = Request.serverVariables("SCRIPT_NAME");if (Request.serverVariables("REQUEST_METHOD")=="POST"){        var oo = new uploadFile(