class_upload.asp
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:10k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

ASP/ASPX

  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. Class NetRube_Upload
  48. Public File, Form
  49. Private oSourceData
  50. Private nMaxSize, nErr, sAllowed, sDenied, sHtmlExtensions
  51. Private Sub Class_Initialize
  52. nErr = 0
  53. nMaxSize = 1048576
  54. Set File = Server.CreateObject("Scripting.Dictionary")
  55. File.CompareMode = 1
  56. Set Form = Server.CreateObject("Scripting.Dictionary")
  57. Form.CompareMode = 1
  58. Set oSourceData = Server.CreateObject("ADODB.Stream")
  59. oSourceData.Type = 1
  60. oSourceData.Mode = 3
  61. oSourceData.Open
  62. End Sub
  63. Private Sub Class_Terminate
  64. Form.RemoveAll
  65. Set Form = Nothing
  66. File.RemoveAll
  67. Set File = Nothing
  68. oSourceData.Close
  69. Set oSourceData = Nothing
  70. End Sub
  71. Public Property Get Version
  72. Version = "NetRube Upload Class Version 2.3 Build 20070528"
  73. End Property
  74. Public Property Get ErrNum
  75. ErrNum = nErr
  76. End Property
  77. Public Property Let MaxSize(nSize)
  78. nMaxSize = nSize
  79. End Property
  80. Public Property Let Allowed(sExt)
  81. sAllowed = sExt
  82. End Property
  83. Public Property Let Denied(sExt)
  84. sDenied = sExt
  85. End Property
  86. Public Property Let HtmlExtensions(sExt)
  87. sHtmlExtensions = sExt
  88. End Property
  89. Public Sub GetData
  90. Dim aCType
  91. aCType = Split(Request.ServerVariables("HTTP_CONTENT_TYPE"), ";")
  92. if ( uBound(aCType) < 0 ) then
  93. nErr = 1
  94. Exit Sub
  95. end if
  96. If aCType(0) <> "multipart/form-data" Then
  97. nErr = 1
  98. Exit Sub
  99. End If
  100. Dim nTotalSize
  101. nTotalSize = Request.TotalBytes
  102. If nTotalSize < 1 Then
  103. nErr = 2
  104. Exit Sub
  105. End If
  106. If nMaxSize > 0 And nTotalSize > nMaxSize Then
  107. nErr = 3
  108. Exit Sub
  109. End If
  110. 'Thankful long(yrl031715@163.com)
  111. 'Fix upload large file.
  112. '**********************************************
  113. ' 修正作者:long
  114. ' 联系邮件: yrl031715@163.com
  115. ' 修正时间:2007年5月6日
  116. ' 修正说明:由于iis6的Content-Length 头信息中包含的请求长度超过了 AspMaxRequestEntityAllowed 的值(默认200K), IIS 将返回一个 403 错误信息.
  117. '          直接导致在iis6下调试FCKeditor上传功能时,一旦文件超过200K,上传文件时文件管理器失去响应,受此影响,文件的快速上传功能也存在在缺陷。
  118. '          在参考 宝玉 的 Asp无组件上传带进度条 演示程序后作出如下修改,以修正在iis6下的错误。
  119. Dim nTotalBytes, nPartBytes, ReadBytes
  120. ReadBytes = 0
  121. nTotalBytes = Request.TotalBytes
  122. '循环分块读取
  123. Do While ReadBytes < nTotalBytes
  124. '分块读取
  125. nPartBytes = 64 * 1024 '分成每块64k
  126. If nPartBytes + ReadBytes > nTotalBytes Then
  127. nPartBytes = nTotalBytes - ReadBytes
  128. End If
  129. oSourceData.Write Request.BinaryRead(nPartBytes)
  130. ReadBytes = ReadBytes + nPartBytes
  131. Loop
  132. '**********************************************
  133. oSourceData.Position = 0
  134. Dim oTotalData, oFormStream, sFormHeader, sFormName, bCrLf, nBoundLen, nFormStart, nFormEnd, nPosStart, nPosEnd, sBoundary
  135. oTotalData = oSourceData.Read
  136. bCrLf = ChrB(13) & ChrB(10)
  137. sBoundary = MidB(oTotalData, 1, InStrB(1, oTotalData, bCrLf) - 1)
  138. nBoundLen = LenB(sBoundary) + 2
  139. nFormStart = nBoundLen
  140. Set oFormStream = Server.CreateObject("ADODB.Stream")
  141. Do While (nFormStart + 2) < nTotalSize
  142. nFormEnd = InStrB(nFormStart, oTotalData, bCrLf & bCrLf) + 3
  143. With oFormStream
  144. .Type = 1
  145. .Mode = 3
  146. .Open
  147. oSourceData.Position = nFormStart
  148. oSourceData.CopyTo oFormStream, nFormEnd - nFormStart
  149. .Position = 0
  150. .Type = 2
  151. .CharSet = "UTF-8"
  152. sFormHeader = .ReadText
  153. .Close
  154. End With
  155. nFormStart = InStrB(nFormEnd, oTotalData, sBoundary) - 1
  156. nPosStart = InStr(22, sFormHeader, " name=", 1) + 7
  157. nPosEnd = InStr(nPosStart, sFormHeader, """")
  158. sFormName = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
  159. If InStr(45, sFormHeader, " filename=", 1) > 0 Then
  160. Set File(sFormName) = New NetRube_FileInfo
  161. File(sFormName).FormName = sFormName
  162. File(sFormName).Start = nFormEnd
  163. File(sFormName).Size = nFormStart - nFormEnd - 2
  164. nPosStart = InStr(nPosEnd, sFormHeader, " filename=", 1) + 11
  165. nPosEnd = InStr(nPosStart, sFormHeader, """")
  166. File(sFormName).ClientPath = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
  167. File(sFormName).Name = Mid(File(sFormName).ClientPath, InStrRev(File(sFormName).ClientPath, "") + 1)
  168. File(sFormName).Ext = LCase(Mid(File(sFormName).Name, InStrRev(File(sFormName).Name, ".") + 1))
  169. nPosStart = InStr(nPosEnd, sFormHeader, "Content-Type: ", 1) + 14
  170. nPosEnd = InStr(nPosStart, sFormHeader, vbCr)
  171. File(sFormName).MIME = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
  172. Else
  173. With oFormStream
  174. .Type = 1
  175. .Mode = 3
  176. .Open
  177. oSourceData.Position = nFormEnd
  178. oSourceData.CopyTo oFormStream, nFormStart - nFormEnd - 2
  179. .Position = 0
  180. .Type = 2
  181. .CharSet = "UTF-8"
  182. Form(sFormName) = .ReadText
  183. .Close
  184. End With
  185. End If
  186. nFormStart = nFormStart + nBoundLen
  187. Loop
  188. oTotalData = ""
  189. Set oFormStream = Nothing
  190. End Sub
  191. Public Sub SaveAs(sItem, sFileName)
  192. If File(sItem).Size < 1 Then
  193. nErr = 2
  194. Exit Sub
  195. End If
  196. If Not IsAllowed(File(sItem).Ext) Then
  197. nErr = 4
  198. Exit Sub
  199. End If
  200. If InStr( LCase( sFileName ), "::$data" ) > 0 Then
  201. nErr = 4
  202. Exit Sub
  203. End If
  204. Dim sFileExt, iFileSize
  205. sFileExt = File(sItem).Ext
  206. iFileSize = File(sItem).Size
  207. ' Check XSS.
  208. If Not IsHtmlExtension( sFileExt ) Then
  209. ' Calculate the size of data to load (max 1Kb).
  210. Dim iXSSSize
  211. iXSSSize = iFileSize
  212. If iXSSSize > 1024 Then
  213. iXSSSize = 1024
  214. End If
  215. ' Read the data.
  216. Dim sData
  217. oSourceData.Position = File(sItem).Start
  218. sData = oSourceData.Read( iXSSSize ) ' Byte Array
  219. sData = ByteArray2Text( sData ) ' String
  220. ' Sniff HTML data.
  221. If SniffHtml( sData ) Then
  222. nErr = 4
  223. Exit Sub
  224. End If
  225. End If
  226. Dim oFileStream
  227. Set oFileStream = Server.CreateObject("ADODB.Stream")
  228. With oFileStream
  229. .Type = 1
  230. .Mode = 3
  231. .Open
  232. oSourceData.Position = File(sItem).Start
  233. oSourceData.CopyTo oFileStream, File(sItem).Size
  234. .Position = 0
  235. .SaveToFile sFileName, 2
  236. .Close
  237. End With
  238. Set oFileStream = Nothing
  239. End Sub
  240. Private Function IsAllowed(sExt)
  241. Dim oRE
  242. Set oRE = New RegExp
  243. oRE.IgnoreCase = True
  244. oRE.Global = True
  245. If sDenied = "" Then
  246. oRE.Pattern = sAllowed
  247. IsAllowed = (sAllowed = "") Or oRE.Test(sExt)
  248. Else
  249. oRE.Pattern = sDenied
  250. IsAllowed = Not oRE.Test(sExt)
  251. End If
  252. Set oRE = Nothing
  253. End Function
  254. Private Function IsHtmlExtension( sExt )
  255. If sHtmlExtensions = "" Then
  256. Exit Function
  257. End If
  258. Dim oRE
  259. Set oRE = New RegExp
  260. oRE.IgnoreCase = True
  261. oRE.Global = True
  262. oRE.Pattern = sHtmlExtensions
  263. IsHtmlExtension = oRE.Test(sExt)
  264. Set oRE = Nothing
  265. End Function
  266. Private Function SniffHtml( sData )
  267. Dim oRE
  268. Set oRE = New RegExp
  269. oRE.IgnoreCase = True
  270. oRE.Global = True
  271. Dim aPatterns
  272. aPatterns = Array( "<!DOCTYPEW*X?HTML", "<(body|head|html|img|pre|script|table|title)", "types*=s*['""]?s*(?:w*/)?(?:ecma|java)", "(?:href|src|data)s*=s*['""]?s*(?:ecma|java)script:", "urls*(s*['""]?s*(?:ecma|java)script:" )
  273. Dim i
  274. For i = 0 to UBound( aPatterns )
  275. oRE.Pattern = aPatterns( i )
  276. If oRE.Test( sData ) Then
  277. SniffHtml = True
  278. Exit Function
  279. End If
  280. Next
  281. SniffHtml = False
  282. End Function
  283. ' Thanks to http://www.ericphelps.com/q193998/index.htm
  284. Private Function ByteArray2Text(varByteArray)
  285. Dim strData, strBuffer, lngCounter
  286. strData = ""
  287. strBuffer = ""
  288. For lngCounter = 0 to UBound(varByteArray)
  289. strBuffer = strBuffer & Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
  290. 'Keep strBuffer at 1k bytes maximum
  291. If lngCounter Mod 1024 = 0 Then
  292. strData = strData & strBuffer
  293. strBuffer = ""
  294. End If
  295. Next
  296. ByteArray2Text = strData & strBuffer
  297. End Function
  298. End Class
  299. Class NetRube_FileInfo
  300. Dim FormName, ClientPath, Path, Name, Ext, Content, Size, MIME, Start
  301. End Class
  302. %>