asp文件上传类Upload.inc

    技术2022-05-11  81

    该类能够从文件的内部判断文件的类型,避免了通过文件名判断文件类型的bug

    Upload.inc

    < %文件上传类 ' ---------------------------------------------------------------------- ' 添加以下属性: ' InceptFileType 允许上传的文件类型,以英文逗号“,”分隔。 ' 添加以下方法: ' FileWidth        图片宽度 ' FileHeight        图片高度 ' ---------------------------------------------------------------------- ' *********************************************************************** Dim  oUpFileStreamClass UpFile_Class     Public  Form,File,Version,Err     Private  CHK_FileType,CHK_MaxSize     Private   Sub  Class_Initialize        Version  =   " 上传类 Version V1.0 "         Err  =   - 1         CHK_FileType  =   ""         CHK_MaxSize  =   - 1          Set  Form  =  Server.CreateObject ( " Scripting.Dictionary " )         Set  File  =  Server.CreateObject ( " Scripting.Dictionary " )         Set  oUpFileStream  =  Server.CreateObject ( " Adodb.Stream " )        Form.CompareMode  =   1         File.CompareMode  =   1         oUpFileStream.Type  =   1         oUpFileStream.Mode  =   3         oUpFileStream.Open     End Sub      Private   Sub  Class_Terminate           ' 清除变量及对像         Form.RemoveAll         Set  Form  =   Nothing         File.RemoveAll         Set  File  =   Nothing         oUpFileStream.Close         Set  oUpFileStream  =   Nothing      End Sub      Public   Property   Get  InceptFileType        InceptFileType  =  CHK_FileType     End Property      Public   Property   Let  InceptFileType(Byval vType)        CHK_FileType  =  vType     End Property      Public   Property   Get  MaxSize        MaxSize  =  CHK_MaxSize     End Property      Public   Property   Let  MaxSize(vSize)         If   IsNumeric (vSize)  Then  CHK_MaxSize  =   Int (vSize)     End Property      Public   Sub  GetDate()        ' 定义变量        Dim  RequestBinDate,sSpace,bCrLf,sInfo,iInfoEnd,tStream,iStart,oFileInfo       Dim  sFormValue,sFileName,sFormName,RequestSize       Dim  iFindStart,iFindEnd,iFormStart,iFormEnd,FileBlag        ' 代码开始       RequestSize  =   Int (Request.TotalBytes)       If   RequestSize  <   1   Then         Err  =   1          Exit   Sub        End   If        Set  tStream  =  Server.CreateObject ( " Adodb.Stream " )      oUpFileStream.Write Request.BinaryRead (RequestSize)      oUpFileStream.Position  =   0       RequestBinDate  =  oUpFileStream.Read      iFormEnd  =  oUpFileStream.Size            bCrLf  =  ChrB ( 13 &  ChrB ( 10 )       ' 取得每个项目之间的分隔符       sSpace  =  MidB (RequestBinDate, 1 , InStrB ( 1 ,RequestBinDate,bCrLf) - 1 )      iStart  =  LenB  (sSpace)      iFormStart  =  iStart + 2        ' 分解项目        Do         iInfoEnd  =  InStrB (iFormStart,RequestBinDate,bCrLf  &  bCrLf) + 3         tStream.Type  =   1         tStream.Mode  =   3         tStream.Open        oUpFileStream.Position  =  iFormStart        oUpFileStream.CopyTo tStream,iInfoEnd - iFormStart        tStream.Position  =   0         tStream.Type  =   2         tStream.CharSet  =   " gb2312 "         sInfo  =  tStream.ReadText         ' 取得表单项目名称         iFormStart  =  InStrB (iInfoEnd,RequestBinDate,sSpace) - 1         iFindStart  =   InStr ( 22 ,sInfo, " name="" " , 1 ) + 6         iFindEnd  =   InStr (iFindStart,sInfo, " "" " , 1 )        sFormName  =   Mid (sinfo,iFindStart,iFindEnd - iFindStart)         ' 如果是文件          If   InStr ( 45 ,sInfo, " filename="" " , 1 >   0   Then              Set  oFileInfo  =   new  FileInfo_Class             ' 取得文件属性             iFindStart  =   InStr (iFindEnd,sInfo, " filename="" " , 1 ) + 10             iFindEnd  =   InStr (iFindStart,sInfo, " "" " , 1 )            sFileName  =   Mid (sinfo,iFindStart,iFindEnd - iFindStart)            oFileInfo.FileName  =   Mid (sFileName, InStrRev (sFileName,  " " ) + 1 )            oFileInfo.FilePath  =   Left (sFileName, InStrRev (sFileName,  " " ))            oFileInfo.FileExt  =   Lcase ( Mid (sFileName, InStrRev (sFileName,  " . " ) + 1 ))            iFindStart  =   InStr  (iFindEnd,sInfo, " Content-Type:  " , 1 ) + 14             iFindEnd  =   InStr  (iFindStart,sInfo,vbCr)            oFileInfo.FileType  =   Ucase ( Mid (sinfo,iFindStart,iFindEnd - iFindStart))            oFileInfo.FileStart  =  iInfoEnd            oFileInfo.FileSize  =  iFormStart  - iInfoEnd  - 2             oFileInfo.FormName  =  sFormName             If   Instr (oFileInfo.FileType, " IMAGE/ " Or   Instr (oFileInfo.FileType, " FLASH " Then                 FileBlag  =  GetImageSize                oFileInfo.FileExt  =  FileBlag( 0 )                oFileInfo.FileWidth  =  FileBlag( 1 )                oFileInfo.FileHeight  =  FileBlag( 2 )                FileBlag  =   Empty              End   If              If  CHK_MaxSize  >   0   Then                  If  oFileInfo.FileSize  >  CHK_MaxSize  Then                     Err  =   2                      Exit   Sub                  End   If              End   If              If  CheckErr(oFileInfo.FileExt)  =   False   Then                  Exit   Sub              End   If             File.Add sFormName,oFileInfo         Else              ' 如果是表单项目             tStream.Close            tStream.Type  =   1             tStream.Mode  =   3             tStream.Open            oUpFileStream.Position  =  iInfoEnd             oUpFileStream.CopyTo tStream,iFormStart - iInfoEnd - 2             tStream.Position  =   0             tStream.Type  =   2             tStream.CharSet  =   " gb2312 "             sFormValue  =  tStream.ReadText             If  Form.Exists (sFormName)  Then  _                Form (sFormName)  =  Form (sFormName)  &   " "   &  sFormValue _             Else  _                Form.Add sFormName,sFormValue         End   If         tStream.Close        iFormStart  =  iFormStart + iStart + 2        ' 如果到文件尾了就退出        Loop  Until  (iFormStart + 2 =  iFormEnd      RequestBinDate  =   ""        Set  tStream  =   Nothing      End Sub      ' ====================================================================      ' 验证上传类型      ' ====================================================================      Private   Function  CheckErr(Byval ChkExt)        CheckErr = False          If  CHK_FileType  =   ""   Then  CheckErr = True  :  Exit   Function          Dim  ChkStr        ChkStr  =   " , " & Lcase (CHK_FileType) & " , "          If   Instr (ChkStr, " , " & ChkExt & " , " ) > 0   Then             CheckErr = True          Else             Err  =   3          End   If      End Function      ' ====================================================================      ' 图像宽高类型读取      ' ====================================================================      Private   Function  Bin2Str(Byval Bin)         Dim  i, Str, Sclow         For  i  =   1   To  LenB(Bin)            Sclow  =  MidB(Bin,i, 1 )             If  ASCB(Sclow) < 128   Then                 Str  =  Str  &   Chr (ASCB(Sclow))             Else                 i  =  i + 1                  If  i  <=  LenB(Bin)  Then  Str  =  Str  &   Chr (ASCW(MidB(Bin,i, 1 ) & Sclow))             End   If          Next          Bin2Str  =  Str     End Function      Private   Function  Num2Str(Byval num,Byval Base,Byval Lens)         Dim  ImageSize        ImageSize  =   ""          While (num >= Base)            ImageSize  =  (num  mod  Base)  &  ImageSize            num  =  (num  -  num  mod  Base) / Base         Wend         Num2Str  =   Right ( String (Lens, " 0 " &  num  &  ImageSize,Lens)     End Function      Private   Function  Str2Num(Byval str,Byval Base)         Dim  ImageSize,i        ImageSize  =   0          For  i = 1   To   Len (str)            ImageSize  =  ImageSize  * Base  +   Cint ( Mid (str,i, 1 ))         Next         Str2Num  =  ImageSize     End Function      Private   Function  BinVal(Byval bin)         Dim  ImageSize,i        ImageSize  =   0          For  i  =  lenb(bin)  To   1  Step  - 1             ImageSize  =  ImageSize  * 256   +  ASCB(Midb(bin,i, 1 ))         Next         BinVal  =  ImageSize     End Function      Private   Function  BinVal2(Byval bin)         Dim  ImageSize,i        ImageSize  =   0          For  i  =   1   To  Lenb(bin)            ImageSize  =  ImageSize  * 256   +  ASCB(Midb(bin,i, 1 ))         Next         BinVal2  =  ImageSize     End Function      Private   Function  GetImageSize()          Dim  ImageSize( 2 ),bFlag        bFlag  =  oUpFileStream.Read( 3 )         Select   Case   Hex (BinVal(bFlag))             Case   " 4E5089 " :                oUpFileStream.Read( 15 )                ImageSize( 0 =   " png "                 ImageSize( 1 =  BinVal2(oUpFileStream.Read( 2 ))                oUpFileStream.Read( 2 )                ImageSize( 2 =  BinVal2(oUpFileStream.Read( 2 ))             Case   " 464947 " :                oUpFileStream.Read( 3 )                ImageSize( 0 =   " gif "                 ImageSize( 1 =  BinVal(oUpFileStream.Read( 2 ))                ImageSize( 2 =  BinVal(oUpFileStream.Read( 2 ))             Case   " 535746 " :                 Dim  BinData,sConv,nBits                oUpFileStream.Read( 5 )                BinData  =  oUpFileStream.Read( 1 )                sConv  =  Num2Str(ASCB(BinData), 2  , 8 )                nBits  =  Str2Num( Left (sConv, 5 ), 2 )                sConv  =   Mid (sConv, 6 )                 While ( Len (sConv) < nBits * 4 )                    BinData  =  oUpFileStream.Read( 1 )                    sConv  =  sConv & Num2Str(ASCB(BinData), 2  , 8 )                 Wend                 ImageSize( 0 =   " swf "                 ImageSize( 1 =   Int ( ABS (Str2Num( Mid (sConv, 1 * nBits + 1 ,nBits), 2 ) - Str2Num( Mid (sConv, 0 * nBits + 1 ,nBits), 2 )) / 20 )                ImageSize( 2 =   Int ( ABS (Str2Num( Mid (sConv, 3 * nBits + 1 ,nBits), 2 ) - Str2Num( Mid (sConv, 2 * nBits + 1 ,nBits), 2 )) / 20 )             Case   " 535743 " : ' flashmx                 ImageSize( 0 =   " swf "                 ImageSize( 1 =   0                 ImageSize( 2 =   0              Case   " FFD8FF " :                 Dim  p1                 Do                       Do : p1  =  BinVal(oUpFileStream.Read( 1 )):  Loop   While  p1  =   255   And   Not  oUpFileStream.EOS                     If  p1 > 191   and  p1 < 196   Then   Exit   Do   Else  oUpFileStream.Read(BinVal2(oUpFileStream.Read( 2 )) - 2 )                     Do :p1  =  BinVal(oUpFileStream.Read( 1 )): Loop   While  p1 < 255   And   Not  oUpFileStream.EOS                     Loop   While   True                     oUpFileStream.Read( 3 )                    ImageSize( 0 =   " jpg "                     ImageSize( 2 =  BinVal2(oUpFileStream.Read( 2 ))                    ImageSize( 1 =  BinVal2(oUpFileStream.Read( 2 ))             Case   Else :                 If   Left (Bin2Str(bFlag), 2 =   " BM "   Then                     oUpFileStream.Read( 15 )                    ImageSize( 0 =   " bmp "                     ImageSize( 1 =  BinVal(oUpFileStream.Read( 4 ))                    ImageSize( 2 =  BinVal(oUpFileStream.Read( 4 ))                 Else                     ImageSize( 0 =   " (UNKNOWN) "                  End   If          End   Select         GetImagesize  =  ImageSize     End Function End  Class ' 文件属性类 Class FileInfo_Class     Public  FormName,FileName,FilePath,FileSize,FileType,FileStart,FileExt,FileWidth,FileHeight     Private   Sub  Class_Initialize        FileWidth = 0         FileHeight = 0      End Sub      ' 保存文件方法      Public   Sub  SaveToFile (Byval Path)         Dim  Ext,oFileStream        Ext  =   LCase ( Mid (Path,  InStrRev (Path,  " . " +   1 ))         If  Ext  <>  FileExt  Then   Exit   Sub          If   Trim (Path) = ""   or  FileStart = 0   or  FileName = ""   or   Right (Path, 1 ) = " / "   Then   Exit   Sub          ' On Error Resume Next          Set  oFileStream  =   CreateObject  ( " Adodb.Stream " )        oFileStream.Type  =   1         oFileStream.Mode  =   3         oFileStream.Open        oUpFileStream.Position  =  FileStart        oUpFileStream.CopyTo oFileStream,FileSize        oFileStream.SaveToFile Path, 2         oFileStream.Close         Set  oFileStream  =   Nothing       End Sub      ' 取得文件数据      Public   Function  FileData        oUpFileStream.Position  =  FileStart        FileData  =  oUpFileStream.Read (FileSize)     End Function End  Class% >  

    最新回复(0)