程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> asp upload_5xsoft.inc中文亂碼的解決方法

asp upload_5xsoft.inc中文亂碼的解決方法

編輯:ASP技巧
為了兼容多語言版本,最後把化境無組件上傳類(upload_5xsoft.inc)改成utf8編碼版本,現在出現了上傳中文名稱的文件的時候,經常上傳不了,提示文件格式不正確。由是把上傳的文件名輸出來看看,發現了原來是亂碼引起的。網上關於解決這個亂碼的方法不多,但還是被我找到了,我把發到這裡來,希望能幫助其他遇到這個問題的朋友。
首先、先使用以下的代碼替換掉你原來的upload_5xsoft.inc文件,這是在原來的基礎上處理。 001 <SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT> 002 dim upfile_5xSoft_Stream 003 Class upload_5xSoft   004 dim Form,File,Version   005 Private Sub Class_Initialize 006 dim iStart,iFileNameStart,iFileNameEnd,IEnd,vbEnter,iFormStart,iFormEnd,theFile 007 dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr,FormName 008 Version="" 009 if Request.TotalBytes <1 then Exit Sub 010 set Form=CreateObject("Scripting.Dictionary") 011 set File=CreateObject("Scripting.Dictionary") 012 set upfile_5xSoft_Stream=CreateObject("Adodb.Stream") 013 upfile_5xSoft_Stream.mode=3 014 upfile_5xSoft_Stream.type=1 015 upfile_5xSoft_Stream.open 016 upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes) 017   018 vbEnter=Chr(13)&Chr(10) 019 iDivLen=inString(1,vbEnter)+1 020 strDiv=subString(1,iDivLen) 021 iFormStart=iDivLen 022 iFormEnd=inString(iformStart,strDiv)-1 023 while iFormStart < iFormEnd 024   iStart=inString(iFormStart,"name=""") 025   IEnd=inString(iStart+6,"""") 026   mFormName=subString(iStart+6,IEnd-iStart-6) 027   iFileNameStart=inString(IEnd+1,"filename=""") 028   if iFileNameStart> 0 and iFileNameStart <iFormEnd then 029   iFileNameEnd=inString(iFileNameStart+10,"""") 030   mFileName=subString(iFileNameStart+10,iFileNameEnd-iFileNameStart-10) 031   iStart=inString(iFileNameEnd+1,vbEnter&vbEnter) 032   IEnd=inString(iStart+4,vbEnter&strDiv) 033   if IEnd> iStart then 034 mFileSize=IEnd-iStart-4 035   else 036 mFileSize=0 037   end if 038   set theFile=new FileInfo 039   theFile.FileName=getFileName(mFileName) 040   theFile.FilePath=getFilePath(mFileName) 041   theFile.FileSize=mFileSize 042   theFile.FileStart=iStart+4 043   theFile.FormName=FormName 044   file.add Lcase(mFormName),theFile 045   else 046   iStart=inString(IEnd+1,vbEnter&vbEnter) 047   IEnd=inString(iStart+4,vbEnter&strDiv) 048   049   if IEnd> iStart then 050         mFormValue=subString(iStart+4,IEnd-iStart-4) 051   else 052         mFormValue="" 053   end if 054   form.Add Lcase(mFormName),mFormValue 055   end if 056   057   iFormStart=iformEnd+iDivLen 058   iFormEnd=inString(iformStart,strDiv)-1 059 wend 060 End Sub 061   062 Private Function subString(theStart,theLen) 063 dim i,c,stemp 064 upfile_5xSoft_Stream.Position=theStart-1 065 if theLen> 0 then subString=BytesToBstr(upfile_5xSoft_Stream.Read(theLen),"utf-8") else subString="" 066 End function 067   068 Function BytesToBstr(strBody,CodeBase) 069       dim obJStream 070       set obJStream = Server.CreateObject("Adodb.Stream") 071       obJStream.Type = 1 072       obJStream.Mode =3 073       obJStream.Open 074       obJStream.Write strBody 075       obJStream.Position = 0 076       obJStream.Type = 2 077       obJStream.Charset = CodeBase 078       BytesToBstr = obJStream.ReadText 079       obJStream.Close 080       set obJStream = nothing 081 End Function 082   083 Private Function inString(theStart,varStr) 084 dim i,j,bt,theLen,str 085 InString=0 086 Str=toByte(varStr) 087 theLen=LenB(Str) 088 for i=theStart to upfile_5xSoft_Stream.Size-theLen 089   if i> upfile_5xSoft_Stream.size then exit Function 090   upfile_5xSoft_Stream.Position=i-1 091   if AscB(upfile_5xSoft_Stream.Read(1)) =AscB(midB(Str,1)) then 092     InString=i 093     for j=2 to theLen 094     if upfile_5xSoft_Stream.EOS then 095       inString=0 096       Exit for 097     end if 098     if AscB(upfile_5xSoft_Stream.Read(1)) <> AscB(MidB(Str,j,1)) then 099       InString=0 100       Exit For 101     end if 102     next 103     if InString <> 0 then Exit Function 104   end if 105 next 106 End Function 107   108 Private Sub Class_Terminate   109   form.RemoveAll 110   file.RemoveAll 111   set form=nothing 112   set file=nothing 113   upfile_5xSoft_Stream.close 114   set upfile_5xSoft_Stream=nothing 115 End Sub 116     117   118 Private function GetFilePath(FullPath) 119   If FullPath <> "" Then 120   GetFilePath = left(FullPath,InStrRev(FullPath, "\")) 121   Else 122   GetFilePath = "" 123   End If 124 End   function 125   126 Private function GetFileName(FullPath) 127   If FullPath <> "" Then 128   GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1) 129   Else 130   GetFileName = "" 131   End If 132 End   function 133   134 Private function toByte(Str) 135   dim i,iCode,c,iLow,iHigh 136   toByte="" 137   For i=1 To Len(Str) 138   c=mid(Str,i,1) 139   iCode =Asc(c) 140   If iCode <0 Then iCode = iCode + 65535 141   If iCode> 255 Then 142     iLow = Left(Hex(Asc(c)),2) 143     iHigh =Right(Hex(Asc(c)),2) 144     toByte = toByte & chrB("&H"&iLow) & chrB("&H"&iHigh) 145   Else 146     toByte = toByte & chrB(AscB(c)) 147   End If 148   Next 149 End function 150   151 End Class 152   153   154 Class FileInfo 155   dim FormName,FileName,FilePath,FileSize,FileStart 156   Private Sub Class_Initialize 157     FileName = "" 158     FilePath = "" 159     FileSize = 0 160     FileStart= 0 161     FormName = "" 162   End Sub 163     164 Public function SaveAs(FullPath) 165     dim dr,ErrorChar,i 166     SaveAs=1 167     if trim(fullpath)="" or FileSize=0 or FileStart=0 or FileName=""then exit function 168     if FileStart=0 or right(fullpath,1)="/" then exit function 169     set dr=CreateObject("Adodb.Stream") 170     dr.Mode=3 171     dr.Type=1 172     dr.Open 173     upfile_5xSoft_Stream.position=FileStart-1 174     upfile_5xSoft_Stream.copyto dr,FileSize 175     dr.SaveToFile FullPath,2 176     dr.Close 177     set dr=nothing 178     SaveAs=0 179   end function 180 End Class 181 </SCRIPT>(鼠標移到代碼上去,在代碼的頂部會出現四個圖標,第一個是查看源代碼,第二個是復制代碼,第三個是打印代碼,第四個是幫助)


第二、將這個文件保存為utf-8編碼的文件

 

再上傳一個帶中文名的文件試試,解決了吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved