答案:第五天:得到文件单元
今天我们要进行的部分,是比较有趣味性地——得到文件内容。其实,看看我们的要处理的数据,再看看前天文本单元的处理,相信大家也会心中有数。
为了清晰的区分文件和文本单元,这一次,我们用ourRequest.file(index)来对应文本单元的ourRequest.form(index)。当然,因为对于文件,我们需要得到的信息不同于文本,所以这次得到的,也不会是FormElement,而是一个新对象FileElement。
文件单元和文本单元在原始数据上,不同点少得可怜:
1。第一行多了一个filename="xxx"模块;
2。多了一个用于指示contentType的第二行。
感兴趣的目标信息不同,所以,得到的对象FileElement也和FormElement有一些不同点:
1。不需要count属性(不存在checkbox情况);
2。不需要Item(index)(同上,不存在checkbox情况);
3。需要一个ContentType属性;
4。需要一个FilePath属性;
5。需要一个FileName属性;
6。需要一个Size属性;
7。因为需要的是二进制,所以,没有必要进行二进制=>字符串的转换;
8。因为需要的是二进制,所以,属性Value改成Data更合适
此外,UploadRequest也应该相应的添加Files属性、Form(index)方法、以及m_dicFiles成员。现在,我们就来扩充他:
A。UploadRequest(上面设计过,这里是扩充)
这个类和request对象是对应的
属性:
RawData 得到原始数据,方便检查[只读]
Forms 得到一个有count属性的计数器,
可以用outRequest.Forms.Count的方式,得到文本表单域的的个数[只读]
Files 得到一个有count属性的计数器,
可以用outRequest.Files.Count的方式,得到文件表单域的的个数[只读]
Form(index) 可以用数字或文本检索文本表单域,做用类似request.form。
他返回一个FormElement型的对象
File(index) 可以用数字或文本检索文件表单域,他返回一个FileElement型的对象
B。FileElement
可以把它看成单个文件域的化身。通过这个类,可以得到详细的文件信息,比如name,data,path,filename,contentType,size等等。
属性:
Name 文件域的名称。就是<input type=file name=xxx>里的xxx
Data 文件域的内容。二进制串
ContentType 文件域的contentType
FilePath 文件域包含的文件在客户机上的全路径
FileName 文件域包含的文件的文件名
Size 文件域包含的文件的尺寸
这里是实现。还是存成doupload.asp:
<%
'=========================================================================
'' 这个,是存储文本域信息的的类。每一个name的文本域,对应一个这样的类。
'=========================================================================
Class FormElement
' m_开头,表示类成员变量。
Private m_dicItems
Private Sub Class_Initialize()
Set m_dicItems = Server.CreateObject("Scripting.Dictionary")
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()
Keys = m_dicItems.Keys
Name = Keys(0)
Name = left(Name,instrrev(Name,"_")-1)
End Property
' Item属性用来得到重名表单域(比如checkbox)的某一个值
Public Property Get Item(index)
If isNumeric(index) Then '是数字,合法!
If index > m_dicItems.Count-1 Then
err.raise 1,"IndexOutOfBound", "表单元素子集索引越界"
End If
Itms = m_dicItems.Items
Item = Itms(index)
ElseIf index = "" Then '没给值?那就返回所有的!逗号分隔
Itms = m_dicItems.Items
For i = 0 to m_dicItems.Count-1
If i = 0 Then
Item = Itms(0)
Else
Item = Item & "," & Itms(i)
End If
Next
Else '给个一个不是数字的东东?出错!
err.raise 2,"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_strContentType
Private m_strFilePath
Private m_strFileName
Private m_lSize
' Data是一个默认属性。目的是得到值
Public Default Property Get Data()
Data = m_bData
End Property
' Name是得到文件域名称,就是<input type=file name=xxx>里的xxx
Public Property Get Name()
Name = m_strName
End Property
' ContentType是得到文件contentType
Public Property Get ContentType()
ContentType = m_strContentType
End Property
' FilePath是得到文件在客户端的路径
Public Property Get FilePath()
FilePath = m_strFilePath
End Property
' FilePath是得到文件在客户端的路径
Public Property Get FileName()
FileName = m_strFileName
End Property
' Size是得到文件大小
Public Property Get Size()
Size = m_lSize
End Property
Public Sub Add(name, data, contenttype, path)
m_strName = name
m_bData = data
m_strContentType = contenttype
m_strFilePath = path
m_strFileName = right(path, len(path)-instrrev(path, "\"))
m_lSize = lenb(data)
End Sub
End Class
'=========================================================================
'' 这个,是我们模拟的request类。我们用它完成asp的request完成不了的任务 :)
'=========================================================================
Class UploadRequest
Private m_dicForms
Private m_dicFiles
Private m_bFormdata
Private Sub Class_Initialize()
Set m_dicForms = Server.CreateObject("Scripting.Dictionary")
Set m_dicFiles = Server.CreateObject("Scripting.Dictionary")
Call fill()
End Sub
' 有了这个,就可以检查原始数据了
Public Property Get RawData()
RawData = m_bFormdata
End Property
' 这一段丑陋的代码是为了实现outRequest.Forms.Count这个功能。
Public Property Get Forms()
Set Forms = New Counter
Forms.setCount(m_dicForms.Count)
End Property
' 这一段丑陋的代码是为了实现outRequest.Files.Count这个功能。
Public Property Get Files()
Set Files = New Counter
Files.setCount(m_dicFiles.Count)
End Property
Public Property Get Form(index)
If isNumeric(index) Then '是数字?用数字来检索
If index > m_dicForms.Count-1 Then
err.raise 1,"IndexOutOfBound", "表单元素索引越界"
End If
Items = m_dicForms.Items
Set Form = Items(index)
ElseIf VarType(index) = 8 Then '字符串?也行!
If m_dicForms.Exists(index) Then '存在,就返回值
Set Form = m_dicForms.Item(index)
Else '不存在,就给个空值——request对象就是这么做的。
Exit Property
End If
Else '给了一个不是数字也不是字符串的东东?出错!
err.raise 2,"IllegalArgument", "非法的表单元素索引"
End If
End Property
Public Property Get File(index)
If isNumeric(index) Then '是数字?用数字来检索
If index > m_dicFiles.Count-1 Then
err.raise 1,"IndexOutOfBound", "文件元素索引越界"
End If
Items = m_dicFiles.Items
Set File = Items(index)
ElseIf VarType(index) = 8 Then '字符串?也行!
If m_dicFiles.Exists(index) Then '存在,就返回值
Set File = m_dicFiles.Item(index)
Else '不存在,出错!
err.raise 2,"NullRef", "文件元素索引不存在"
End If
Else '给了一个不是数字也不是字符串的东东?出错!
err.raise 2,
上一个:ASP无组件上传·从原理剖析到实践(下)
下一个:ASP无组件上传·从原理剖析到实践(上)