当前位置:asp编程网>技术教程>Asp教程>  正文

upload_5xsoft.inc中文乱码的解决方法

2012-04-12 21:58:01   来源:网络    作者:佚名   浏览量:4045   收藏
为了兼容多语言版本,最后把化境无组件上传类(upload_5xsoft.inc)改成utf8编码版本,现在出现了上传中文名称的文件的时候,经常上传不了,提示文件格式不正确。由是把上传的文件名输出来看看,发现了原来是乱码引起的。网上关于解决这个乱码的方法不多,但还是被我找到了,我把发到这里来,希望能帮助其他遇到这个问题的朋友。
首先、先使用以下的代码替换掉你原来的upload_5xsoft.inc文件,这是在原来的基础上处理。
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
dim upfile_5xSoft_Stream 
Class upload_5xSoft   
dim Form,File,Version   
Private Sub Class_Initialize 
dim iStart,iFileNameStart,iFileNameEnd,iEnd,vbEnter,iFormStart,iFormEnd,theFile 
dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr,FormName 
Version=""
if Request.TotalBytes <1 then Exit Sub 
set Form=CreateObject("Scripting.Dictionary") 
set File=CreateObject("Scripting.Dictionary") 
set upfile_5xSoft_Stream=CreateObject("Adodb.Stream") 
upfile_5xSoft_Stream.mode=3 
upfile_5xSoft_Stream.type=1 
upfile_5xSoft_Stream.open 
upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes)

vbEnter=Chr(13)&Chr(10) 
iDivLen=inString(1,vbEnter)+1 
strDiv=subString(1,iDivLen) 
iFormStart=iDivLen 
iFormEnd=inString(iformStart,strDiv)-1 
while iFormStart < iFormEnd 
  iStart=inString(iFormStart,"name=""") 
  iEnd=inString(iStart+6,"""") 
  mFormName=subString(iStart+6,iEnd-iStart-6) 
  iFileNameStart=inString(iEnd+1,"filename=""") 
  if iFileNameStart> 0 and iFileNameStart <iFormEnd then 
  iFileNameEnd=inString(iFileNameStart+10,"""") 
  mFileName=subString(iFileNameStart+10,iFileNameEnd-iFileNameStart-10) 
  iStart=inString(iFileNameEnd+1,vbEnter&vbEnter) 
  iEnd=inString(iStart+4,vbEnter&strDiv) 
  if iEnd> iStart then 
mFileSize=iEnd-iStart-4 
  else 
mFileSize=0 
  end if 
  set theFile=new FileInfo 
  theFile.FileName=getFileName(mFileName) 
  theFile.FilePath=getFilePath(mFileName) 
  theFile.FileSize=mFileSize 
  theFile.FileStart=iStart+4 
  theFile.FormName=FormName 
  file.add Lcase(mFormName),theFile 
  else 
  iStart=inString(iEnd+1,vbEnter&vbEnter) 
  iEnd=inString(iStart+4,vbEnter&strDiv)

  if iEnd> iStart then 
		mFormValue=subString(iStart+4,iEnd-iStart-4) 
  else 
		mFormValue="" 
  end if 
  form.Add Lcase(mFormName),mFormValue 
  end if

  iFormStart=iformEnd+iDivLen 
  iFormEnd=inString(iformStart,strDiv)-1 
wend 
End Sub

Private Function subString(theStart,theLen) 
dim i,c,stemp 
upfile_5xSoft_Stream.Position=theStart-1 
if theLen> 0 then subString=BytesToBstr(upfile_5xSoft_Stream.Read(theLen),"utf-8") else subString=""
End function

Function BytesToBstr(strBody,CodeBase) 
      dim objStream 
      set objStream = Server.CreateObject("Adodb.Stream") 
      objStream.Type = 1 
      objStream.Mode =3 
      objStream.Open 
      objStream.Write strBody 
      objStream.Position = 0 
      objStream.Type = 2 
      objStream.Charset = CodeBase 
      BytesToBstr = objStream.ReadText 
      objStream.Close 
      set objStream = nothing 
End Function

Private Function inString(theStart,varStr) 
dim i,j,bt,theLen,str 
InString=0 
Str=toByte(varStr) 
theLen=LenB(Str) 
for i=theStart to upfile_5xSoft_Stream.Size-theLen 
  if i> upfile_5xSoft_Stream.size then exit Function 
  upfile_5xSoft_Stream.Position=i-1 
  if AscB(upfile_5xSoft_Stream.Read(1)) =AscB(midB(Str,1)) then 
    InString=i 
    for j=2 to theLen 
    if upfile_5xSoft_Stream.EOS then 
      inString=0 
      Exit for 
    end if 
    if AscB(upfile_5xSoft_Stream.Read(1)) <> AscB(MidB(Str,j,1)) then 
      InString=0 
      Exit For 
    end if 
    next 
    if InString <> 0 then Exit Function 
  end if 
next 
End Function

Private Sub Class_Terminate   
  form.RemoveAll 
  file.RemoveAll 
  set form=nothing 
  set file=nothing 
  upfile_5xSoft_Stream.close 
  set upfile_5xSoft_Stream=nothing 
End Sub 
  

Private function GetFilePath(FullPath) 
  If FullPath <> "" Then 
  GetFilePath = left(FullPath,InStrRev(FullPath, "\")) 
  Else 
  GetFilePath = ""
  End If 
End   function 

Private function GetFileName(FullPath) 
  If FullPath <> "" Then 
  GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1) 
  Else 
  GetFileName = ""
  End If 
End   function

Private function toByte(Str) 
  dim i,iCode,c,iLow,iHigh 
  toByte=""
  For i=1 To Len(Str) 
  c=mid(Str,i,1) 
  iCode =Asc(c) 
  If iCode <0 Then iCode = iCode + 65535 
  If iCode> 255 Then 
    iLow = Left(Hex(Asc(c)),2) 
    iHigh =Right(Hex(Asc(c)),2) 
    toByte = toByte & chrB("&H"&iLow) & chrB("&H"&iHigh) 
  Else 
    toByte = toByte & chrB(AscB(c)) 
  End If 
  Next 
End function

End Class


Class FileInfo 
  dim FormName,FileName,FilePath,FileSize,FileStart 
  Private Sub Class_Initialize 
    FileName = ""
    FilePath = ""
    FileSize = 0 
    FileStart= 0 
    FormName = ""
  End Sub 
  
Public function SaveAs(FullPath) 
    dim dr,ErrorChar,i 
    SaveAs=1 
    if trim(fullpath)="" or FileSize=0 or FileStart=0 or FileName="" then exit function 
    if FileStart=0 or right(fullpath,1)="/" then exit function 
    set dr=CreateObject("Adodb.Stream") 
    dr.Mode=3 
    dr.Type=1 
    dr.Open 
    upfile_5xSoft_Stream.position=FileStart-1 
    upfile_5xSoft_Stream.copyto dr,FileSize 
    dr.SaveToFile FullPath,2 
    dr.Close 
    set dr=nothing 
    SaveAs=0 
  end function 
End Class
</SCRIPT>
(鼠标移到代码上去,在代码的顶部会出现四个图标,第一个是查看源代码,第二个是复制代码,第三个是打印代码,第四个是帮助)


第二、将这个文件保存为utf-8编码的文件

 

再上传一个带中文名的文件试试,解决了吧!



关于我们-广告合作-联系我们-积分规则-网站地图

Copyright(C)2013-2017版权所属asp编程网