现在的位置: 首页 > 综合 > 正文

解决稻香老农无组件上传类在文件上传时当文件名中含中文单双引号取不到正确的文件名的方案

2013年06月16日 ⁄ 综合 ⁄ 共 3963字 ⁄ 字号 评论关闭

今天完成了对稻香老农的最新版本无组件上传类V2.1的修改。

解决了文件上传时当文件名中含中文单双引号取不到正确的文件名的问题。

参考了无惧上传类,在此感谢稻香老农和梁无惧两位老师,谢谢他们无偿的奉献了自己的源码。

下面附上修改后的代码:

 

<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>

dim Data_5xsoft



Class upload_5xsoft

  

dim objForm,objFile,Version



Public function Form(strForm)

   strForm=lcase(strForm)

   if not objForm.exists(strForm) then

     Form=""

   else

     Form=objForm(strForm)

   end if

 end function



Public function File(strFile)

   strFile=lcase(strFile)

   if not objFile.exists(strFile) then

     set File=new FileInfo

   else

     set File=objFile(strFile)

   end if

 end function





Private Sub Class_Initialize 

  dim RequestData,sStart,bCrlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile

  dim iFileSize,sFilePath,sFileType,sFormValue,sFileName

  dim iFindStart,iFindEnd

  dim iFormStart,iFormEnd,sFormName

  Version="化境HTTP上传程序 Version 2.1"

  set objForm=Server.CreateObject("Scripting.Dictionary")

  set objFile=Server.CreateObject("Scripting.Dictionary")

  if Request.TotalBytes<1 then Exit Sub

  set tStream = Server.CreateObject("adodb.stream")

  set Data_5xsoft = Server.CreateObject("adodb.stream")

  Data_5xsoft.Type = 1

  Data_5xsoft.Mode =3

  Data_5xsoft.Open

  Data_5xsoft.Write  Request.BinaryRead(Request.TotalBytes)

  Data_5xsoft.Position=0

  RequestData =Data_5xsoft.Read 



  iFormStart = 1

  iFormEnd = LenB(RequestData)

  bCrlf = chrB(13) & chrB(10)

  sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,bCrlf)-1)

  iStart = LenB (sStart)

  iFormStart=iFormStart+iStart+1

  while (iFormStart + 10) < iFormEnd 

	iInfoEnd = InStrB(iFormStart,RequestData,bCrlf & bCrlf)+3

	tStream.Type = 1

	tStream.Mode =3

	tStream.Open

	Data_5xsoft.Position = iFormStart

	Data_5xsoft.CopyTo tStream,iInfoEnd-iFormStart

	tStream.Position = 0

	tStream.Type = 2

	tStream.Charset ="gb2312"

	sInfo = tStream.ReadText

	tStream.Close

	'取得表单项目名称

	iFormStart = InStrB(iInfoEnd,RequestData,sStart)

	iFindStart = InStr(22,sInfo,"name=""",1)+6

	iFindEnd = InStr(iFindStart,sInfo,"""",1)

	sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))

	'如果是文件

	if InStr (45,sInfo,"filename=""",1) > 0 then

		set theFile=new FileInfo

		'取得文件名

		iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10

		iFindEnd = InStr(iFindStart,sInfo,""""&vbCrLf,1)

		sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)

		theFile.FileName=getFileName(sFileName)

		theFile.FilePath=getFilePath(sFileName)

		theFile.FileExt=GetFileExt(sFileName)

		'取得文件类型

		iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14

		iFindEnd = InStr(iFindStart,sInfo,vbCr)

		theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart)

		theFile.FileStart =iInfoEnd

		theFile.FileSize = iFormStart -iInfoEnd -3

		theFile.FormName=sFormName

		if not objFile.Exists(sFormName) then

		  objFile.add sFormName,theFile

		end if

	else

	'如果是表单项目

		tStream.Type =1

		tStream.Mode =3

		tStream.Open

		Data_5xsoft.Position = iInfoEnd 

		Data_5xsoft.CopyTo tStream,iFormStart-iInfoEnd-3

		tStream.Position = 0

		tStream.Type = 2

		tStream.Charset ="gb2312"

	        sFormValue = tStream.ReadText 

	        tStream.Close

		if objForm.Exists(sFormName) then

		  objForm(sFormName)=objForm(sFormName)&", "&sFormValue		  

		else

		  objForm.Add sFormName,sFormValue

		end if

	end if

	iFormStart=iFormStart+iStart+1

	wend

  RequestData=""

  set tStream =nothing

End Sub



Private Sub Class_Terminate  

 if Request.TotalBytes>0 then

	objForm.RemoveAll

	objFile.RemoveAll

	set objForm=nothing

	set objFile=nothing

	Data_5xsoft.Close

	set Data_5xsoft =nothing

 end if

End Sub

   

 

 Private function GetFilePath(FullPath)

  If FullPath <> "" Then

   GetFilePath = left(FullPath,InStrRev(FullPath, "/"))

  Else

   GetFilePath = ""

  End If

 End  function



 Private function GetFileExt(FullPath)

  If FullPath <> "" Then

   GetFileExt = mid(FullPath,InStrRev(FullPath, ".")+1)

  Else

   GetFileExt = ""

  End If

 End  function

 

 Private function GetFileName(FullPath)

  If FullPath <> "" Then

   GetFileName = mid(FullPath,InStrRev(FullPath, "/")+1)

  Else

   GetFileName = ""

  End If

 End  function

End Class



Class FileInfo

  dim FormName,FileName,FilePath,FileSize,FileExt,FileType,FileStart

  Private Sub Class_Initialize 

    FileName = ""

    FilePath = ""

    FileSize = 0

    FileStart= 0

    FormName = ""

    FileType = ""

    FileExt  = ""

  End Sub

  

 Public function SaveAs(FullPath)

    dim dr,ErrorChar,i

    SaveAs=true

    if trim(fullpath)="" or FileStart=0 or FileName="" or right(fullpath,1)="/" then exit function

    set dr=CreateObject("Adodb.Stream")

    dr.Mode=3

    dr.Type=1

    dr.Open

    Data_5xsoft.position=FileStart

    Data_5xsoft.copyto dr,FileSize

    dr.SaveToFile FullPath,2

    dr.Close

    set dr=nothing 

    SaveAs=false

  end function

  End Class

</SCRIPT>

抱歉!评论已关闭.