asp文件上传类Upload.inc

本文介绍了一个文件上传类,能够从文件内部判断文件类型,并提供图片尺寸等信息。它避免了仅依赖文件名判断类型的错误,增加了文件大小和类型检查等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Upload.inc

<%
文件上传类
'----------------------------------------------------------------------
'
添加以下属性:
'
InceptFileType 允许上传的文件类型,以英文逗号“,”分隔。
'
添加以下方法:
'
FileWidth        图片宽度
'
FileHeight        图片高度
'
----------------------------------------------------------------------
'
***********************************************************************

Dim oUpFileStream

Class 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
%
>
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红火吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值