Project

General

Profile

1
<%
2
 ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
3
 ' Copyright (C) 2003-2009 Frederico Caldeira Knabben
4
 '
5
 ' == BEGIN LICENSE ==
6
 '
7
 ' Licensed under the terms of any of the following licenses at your
8
 ' choice:
9
 '
10
 '  - GNU General Public License Version 2 or later (the "GPL")
11
 '    http://www.gnu.org/licenses/gpl.html
12
 '
13
 '  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
14
 '    http://www.gnu.org/licenses/lgpl.html
15
 '
16
 '  - Mozilla Public License Version 1.1 or later (the "MPL")
17
 '    http://www.mozilla.org/MPL/MPL-1.1.html
18
 '
19
 ' == END LICENSE ==
20
 '
21
 ' These are the classes used to handle ASP upload without using third
22
 ' part components (OCX/DLL).
23
%>
24
<%
25
'**********************************************
26
' File:		NetRube_Upload.asp
27
' Version:	NetRube Upload Class Version 2.3 Build 20070528
28
' Author:	NetRube
29
' Email:	NetRube@126.com
30
' Date:		05/28/2007
31
' Comments:	The code for the Upload.
32
'			This can free usage, but please
33
'			not to delete this copyright information.
34
'			If you have a modification version,
35
'			Please send out a duplicate to me.
36
'**********************************************
37
' 文件名:	NetRube_Upload.asp
38
' 版本:		NetRube Upload Class Version 2.3 Build 20070528
39
' 作者:		NetRube(网络乡巴佬)
40
' 电子邮件:	NetRube@126.com
41
' 日期:		2007年05月28日
42
' 声明:		文件上传类
43
'			本上传类可以自由使用,但请保留此版权声明信息
44
'			如果您对本上传类进行修改增强,
45
'			请发送一份给俺。
46
'**********************************************
47

    
48
Class NetRube_Upload
49

    
50
	Public	File, Form
51
	Private oSourceData
52
	Private nMaxSize, nErr, sAllowed, sDenied, sHtmlExtensions
53

    
54
	Private Sub Class_Initialize
55
		nErr		= 0
56
		nMaxSize	= 1048576
57

    
58
		Set File			= Server.CreateObject("Scripting.Dictionary")
59
		File.CompareMode	= 1
60
		Set Form			= Server.CreateObject("Scripting.Dictionary")
61
		Form.CompareMode	= 1
62

    
63
		Set oSourceData		= Server.CreateObject("ADODB.Stream")
64
		oSourceData.Type	= 1
65
		oSourceData.Mode	= 3
66
		oSourceData.Open
67
	End Sub
68

    
69
	Private Sub Class_Terminate
70
		Form.RemoveAll
71
		Set Form = Nothing
72
		File.RemoveAll
73
		Set File = Nothing
74

    
75
		oSourceData.Close
76
		Set oSourceData = Nothing
77
	End Sub
78

    
79
	Public Property Get Version
80
		Version = "NetRube Upload Class Version 2.3 Build 20070528"
81
	End Property
82

    
83
	Public Property Get ErrNum
84
		ErrNum	= nErr
85
	End Property
86

    
87
	Public Property Let MaxSize(nSize)
88
		nMaxSize	= nSize
89
	End Property
90

    
91
	Public Property Let Allowed(sExt)
92
		sAllowed	= sExt
93
	End Property
94

    
95
	Public Property Let Denied(sExt)
96
		sDenied	= sExt
97
	End Property
98

    
99
	Public Property Let HtmlExtensions(sExt)
100
		sHtmlExtensions	= sExt
101
	End Property
102

    
103
	Public Sub GetData
104
		Dim aCType
105
		aCType = Split(Request.ServerVariables("HTTP_CONTENT_TYPE"), ";")
106
		if ( uBound(aCType) < 0 ) then
107
			nErr = 1
108
			Exit Sub
109
		end if
110
		If aCType(0) <> "multipart/form-data" Then
111
			nErr = 1
112
			Exit Sub
113
		End If
114

    
115
		Dim nTotalSize
116
		nTotalSize	= Request.TotalBytes
117
		If nTotalSize < 1 Then
118
			nErr = 2
119
			Exit Sub
120
		End If
121
		If nMaxSize > 0 And nTotalSize > nMaxSize Then
122
			nErr = 3
123
			Exit Sub
124
		End If
125

    
126
		'Thankful long(yrl031715@163.com)
127
		'Fix upload large file.
128
		'**********************************************
129
		' 修正作者:long
130
		' 联系邮件: yrl031715@163.com
131
		' 修正时间:2007年5月6日
132
		' 修正说明:由于iis6的Content-Length 头信息中包含的请求长度超过了 AspMaxRequestEntityAllowed 的值(默认200K), IIS 将返回一个 403 错误信息.
133
		'          直接导致在iis6下调试FCKeditor上传功能时,一旦文件超过200K,上传文件时文件管理器失去响应,受此影响,文件的快速上传功能也存在在缺陷。
134
		'          在参考 宝玉 的 Asp无组件上传带进度条 演示程序后作出如下修改,以修正在iis6下的错误。
135

    
136
		Dim nTotalBytes, nPartBytes, ReadBytes
137
		ReadBytes = 0
138
		nTotalBytes = Request.TotalBytes
139
		'循环分块读取
140
		Do While ReadBytes < nTotalBytes
141
			'分块读取
142
			nPartBytes = 64 * 1024 '分成每块64k
143
			If nPartBytes + ReadBytes > nTotalBytes Then
144
				nPartBytes = nTotalBytes - ReadBytes
145
			End If
146
			oSourceData.Write Request.BinaryRead(nPartBytes)
147
			ReadBytes = ReadBytes + nPartBytes
148
		Loop
149
		'**********************************************
150
		oSourceData.Position = 0
151

    
152
		Dim oTotalData, oFormStream, sFormHeader, sFormName, bCrLf, nBoundLen, nFormStart, nFormEnd, nPosStart, nPosEnd, sBoundary
153

    
154
		oTotalData	= oSourceData.Read
155
		bCrLf		= ChrB(13) & ChrB(10)
156
		sBoundary	= MidB(oTotalData, 1, InStrB(1, oTotalData, bCrLf) - 1)
157
		nBoundLen	= LenB(sBoundary) + 2
158
		nFormStart	= nBoundLen
159

    
160
		Set oFormStream = Server.CreateObject("ADODB.Stream")
161

    
162
		Do While (nFormStart + 2) < nTotalSize
163
			nFormEnd	= InStrB(nFormStart, oTotalData, bCrLf & bCrLf) + 3
164

    
165
			With oFormStream
166
				.Type	= 1
167
				.Mode	= 3
168
				.Open
169
				oSourceData.Position = nFormStart
170
				oSourceData.CopyTo oFormStream, nFormEnd - nFormStart
171
				.Position	= 0
172
				.Type		= 2
173
				.CharSet	= "UTF-8"
174
				sFormHeader	= .ReadText
175
				.Close
176
			End With
177

    
178
			nFormStart	= InStrB(nFormEnd, oTotalData, sBoundary) - 1
179
			nPosStart	= InStr(22, sFormHeader, " name=", 1) + 7
180
			nPosEnd		= InStr(nPosStart, sFormHeader, """")
181
			sFormName	= Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
182

    
183
			If InStr(45, sFormHeader, " filename=", 1) > 0 Then
184
				Set File(sFormName)			= New NetRube_FileInfo
185
				File(sFormName).FormName	= sFormName
186
				File(sFormName).Start		= nFormEnd
187
				File(sFormName).Size		= nFormStart - nFormEnd - 2
188
				nPosStart					= InStr(nPosEnd, sFormHeader, " filename=", 1) + 11
189
				nPosEnd						= InStr(nPosStart, sFormHeader, """")
190
				File(sFormName).ClientPath	= Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
191
				File(sFormName).Name		= Mid(File(sFormName).ClientPath, InStrRev(File(sFormName).ClientPath, "\") + 1)
192
				File(sFormName).Ext			= LCase(Mid(File(sFormName).Name, InStrRev(File(sFormName).Name, ".") + 1))
193
				nPosStart					= InStr(nPosEnd, sFormHeader, "Content-Type: ", 1) + 14
194
				nPosEnd						= InStr(nPosStart, sFormHeader, vbCr)
195
				File(sFormName).MIME		= Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
196
			Else
197
				With oFormStream
198
					.Type	= 1
199
					.Mode	= 3
200
					.Open
201
					oSourceData.Position = nFormEnd
202
					oSourceData.CopyTo oFormStream, nFormStart - nFormEnd - 2
203
					.Position	= 0
204
					.Type		= 2
205
					.CharSet	= "UTF-8"
206
					Form(sFormName)	= .ReadText
207
					.Close
208
				End With
209
			End If
210

    
211
			nFormStart	= nFormStart + nBoundLen
212
		Loop
213

    
214
		oTotalData = ""
215
		Set oFormStream = Nothing
216
	End Sub
217

    
218
	Public Sub SaveAs(sItem, sFileName)
219
		If File(sItem).Size < 1 Then
220
			nErr = 2
221
			Exit Sub
222
		End If
223

    
224
		If Not IsAllowed(File(sItem).Ext) Then
225
			nErr = 4
226
			Exit Sub
227
		End If
228

    
229
		If InStr( LCase( sFileName ), "::$data" ) > 0 Then
230
			nErr = 4
231
			Exit Sub
232
		End If
233

    
234
		Dim sFileExt, iFileSize
235
		sFileExt	= File(sItem).Ext
236
		iFileSize	= File(sItem).Size
237

    
238
		' Check XSS.
239
		If Not IsHtmlExtension( sFileExt ) Then
240
			' Calculate the size of data to load (max 1Kb).
241
			Dim iXSSSize
242
			iXSSSize = iFileSize
243

    
244
			If iXSSSize > 1024 Then
245
				iXSSSize = 1024
246
			End If
247

    
248
			' Read the data.
249
			Dim sData
250
			oSourceData.Position = File(sItem).Start
251
			sData = oSourceData.Read( iXSSSize )	' Byte Array
252
			sData = ByteArray2Text( sData )			' String
253

    
254
			' Sniff HTML data.
255
			If SniffHtml( sData ) Then
256
				nErr = 4
257
				Exit Sub
258
			End If
259
		End If
260

    
261
		Dim oFileStream
262
		Set oFileStream = Server.CreateObject("ADODB.Stream")
263
		With oFileStream
264
			.Type		= 1
265
			.Mode		= 3
266
			.Open
267
			oSourceData.Position = File(sItem).Start
268
			oSourceData.CopyTo oFileStream, File(sItem).Size
269
			.Position	= 0
270
			.SaveToFile sFileName, 2
271
			.Close
272
		End With
273
		Set oFileStream = Nothing
274
	End Sub
275

    
276
	Private Function IsAllowed(sExt)
277
		Dim oRE
278
		Set oRE	= New RegExp
279
		oRE.IgnoreCase	= True
280
		oRE.Global		= True
281

    
282
		If sDenied = "" Then
283
			oRE.Pattern	= sAllowed
284
			IsAllowed	= (sAllowed = "") Or oRE.Test(sExt)
285
		Else
286
			oRE.Pattern	= sDenied
287
			IsAllowed	= Not oRE.Test(sExt)
288
		End If
289

    
290
		Set oRE	= Nothing
291
	End Function
292

    
293
	Private Function IsHtmlExtension( sExt )
294
		If sHtmlExtensions = "" Then
295
			Exit Function
296
		End If
297

    
298
		Dim oRE
299
		Set oRE = New RegExp
300
		oRE.IgnoreCase	= True
301
		oRE.Global		= True
302
		oRE.Pattern		= sHtmlExtensions
303

    
304
		IsHtmlExtension = oRE.Test(sExt)
305

    
306
		Set oRE	= Nothing
307
	End Function
308

    
309
	Private Function SniffHtml( sData )
310

    
311
		Dim oRE
312
		Set oRE = New RegExp
313
		oRE.IgnoreCase	= True
314
		oRE.Global		= True
315

    
316
		Dim aPatterns
317
		aPatterns = Array( "<!DOCTYPE\W*X?HTML", "<(body|head|html|img|pre|script|table|title)", "type\s*=\s*[\'""]?\s*(?:\w*/)?(?:ecma|java)", "(?:href|src|data)\s*=\s*[\'""]?\s*(?:ecma|java)script:", "url\s*\(\s*[\'""]?\s*(?:ecma|java)script:" )
318

    
319
		Dim i
320
		For i = 0 to UBound( aPatterns )
321
			oRE.Pattern = aPatterns( i )
322
			If oRE.Test( sData ) Then
323
				SniffHtml = True
324
				Exit Function
325
			End If
326
		Next
327

    
328
		SniffHtml = False
329

    
330
	End Function
331

    
332
	' Thanks to http://www.ericphelps.com/q193998/index.htm
333
	Private Function ByteArray2Text(varByteArray)
334
		Dim strData, strBuffer, lngCounter
335
		strData = ""
336
		strBuffer = ""
337
		For lngCounter = 0 to UBound(varByteArray)
338
			strBuffer = strBuffer & Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
339
			'Keep strBuffer at 1k bytes maximum
340
			If lngCounter Mod 1024 = 0 Then
341
				strData = strData & strBuffer
342
				strBuffer = ""
343
			End If
344
		Next
345
		ByteArray2Text = strData & strBuffer
346
	End Function
347

    
348
End Class
349

    
350
Class NetRube_FileInfo
351
	Dim FormName, ClientPath, Path, Name, Ext, Content, Size, MIME, Start
352
End Class
353
%>
(2-2/8)