asp中无组件上传类及调用方法

<%
dim oUpFileStream

Class upload_file

    
dim Form,File,Version
    
    
Private Sub Class_Initialize 
    
    
'定义变量
    dim RequestBinDate,sStart,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,oFileInfo
    
dim iFileSize,sFilePath,sFileType,sFormvalue,sFileName
    
dim iFindStart,iFindEnd
    
dim iFormStart,iFormEnd,sFormName
    
'代码开始
    Version="无组件上传类 Version 1.00"    
    
    
set Form = Server.CreateObject("Scripting.Dictionary")
    
set File = Server.CreateObject("Scripting.Dictionary")
    
    
if Request.TotalBytes < 1 then Exit Sub
    
    
set tStream = Server.CreateObject("adodb.stream")
    
set oUpFileStream = Server.CreateObject("adodb.stream")
    
    oUpFileStream.Type 
= 1
    oUpFileStream.Mode 
= 3
    oUpFileStream.Open 
    oUpFileStream.Write Request.BinaryRead(Request.TotalBytes)
    oUpFileStream.Position
=0
    RequestBinDate 
= oUpFileStream.Read 
    iFormEnd 
= oUpFileStream.Size
    bCrLf 
= chrB(13& chrB(10)
    
'取得每个项目之间的分隔符
    sStart = MidB(RequestBinDate,1, InStrB(1,RequestBinDate,bCrLf)-1)
    iStart 
= LenB (sStart)
    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,sStart)-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
    
'取得文件属性
    iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
    iFindEnd 
= InStr(iFindStart,sInfo,"""",1)
    sFileName 
= Mid (sinfo,iFindStart,iFindEnd-iFindStart)
    oFileInfo.FileName 
= GetFileName(sFileName)
    oFileInfo.FilePath 
= GetFilePath(sFileName)
    oFileInfo.FileExt 
= GetFileExt(sFileName)
    iFindStart 
= InStr(iFindEnd,sInfo,"Content-Type: ",1)+14
    iFindEnd 
= InStr(iFindStart,sInfo,vbCr)
    oFileInfo.FileType 
= Mid (sinfo,iFindStart,iFindEnd-iFindStart)
    oFileInfo.FileStart 
= iInfoEnd
    oFileInfo.FileSize 
= iFormStart -iInfoEnd -2
    oFileInfo.FormName 
= sFormName
    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 
    form.Add sFormName,sFormvalue
    
end if
    tStream.Close
    iFormStart 
= iFormStart+iStart+2
    
'如果到文件尾了就退出
    loop until (iFormStart+2= iFormEnd 
    RequestBinDate
=""
    
set tStream = nothing
    
    
End Sub

    
Private Sub Class_Terminate 
    
        
'清除变量及对像
        if not Request.TotalBytes<1 then
        oUpFileStream.Close
        
set oUpFileStream =nothing
        
end if
        Form.RemoveAll
        File.RemoveAll
        
set Form=nothing
        
set File=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 GetFileExt(FullPath)
    
        
If FullPath <> "" Then
        GetFileExt 
= mid(FullPath,InStrRev(FullPath, "."))
        
Else
        GetFileExt 
= ""
        
End If
        
    
End function
    
    
'检测后缀名是否为可允许的上传类型
    public function CheckFileExt(FileName,FileType)    
        fileExt 
= UCase(GetFileExt(FileName))
        
if (Instr(FileType,fileExt)> 0 ) then
            CheckFileExt 
= true
        
else
            CheckFileExt 
= false
        
end if    
    
End function
    
    
'获得服务器上以时间命名的文件名
    public function GetServerFileName(FileName)
        fileExt 
= GetFileExt(FileName)
        GetServerFileName 
= year(now())&month(now())&day(now())&hour(now())&minute(now())&second(now())&fileExt
    
End function
    
End Class

'文件属性类
Class FileInfo

    
dim FormName,FileName,FilePath,FileSize,FileType,FileStart,FileExt
    
dim ImgExt,RarExt,MedExt,FlvExt,DocExt
    
dim UploadPath
    
    
Private Sub Class_Initialize 
    
        FileName 
= ""
        FilePath 
= ""
        FileSize 
= 0
        FileStart
= 0
        FormName 
= ""
        FileType 
= ""
        FileExt  
= ""
        ImgExt   
= "|.JPG|.GIF|.PNG|.BMP|.JPEG|"  '可允许上传图片类型
        RarExt   = "|.RAR|.ZIP|"                  '可允许上传压缩文件
        MedExt   = "|.MP3|.WMA|"                  '可允许上传音乐文件
        FlvExt   = "|.FLV|.SWF|"                  '可允许上传flash文件
        DocExt   = "|.DOC|.TXT|"                  '可允许上传的文档
        
        UploadPath 
= "/Upload/"                   '文件上传目录
        
    
End Sub

    
'保存文件方法
    Public function SaveToFile(FullPath)
    
        
dim oFileStream,ErrorChar,i
        SaveToFile
=1
        
if trim(fullpath)="" or right(fullpath,1)="/" then exit function
        
set oFileStream=CreateObject("Adodb.Stream")
        oFileStream.Type
=1
        oFileStream.Mode
=3
        oFileStream.Open
        oUpFileStream.position
=FileStart
        oUpFileStream.copyto oFileStream,FileSize
        oFileStream.SaveToFile FullPath,
2
        oFileStream.Close
        
set oFileStream=nothing 
        SaveToFile
=0
    
    
end function
    
    
End Class
%
>


 

 

 

dim upload,file,formName,formPath,iCount,fileName,fullFilePath
        
set upload = new upload_file
        
        ddlType             
= CheckInputStr(upload.form("ddlType"))
        txtTitle            
= CheckInputStr(upload.form("txtTitle"))
        WebEcitorContent    
= CheckInputString(upload.form("WebEcitorContent"))
        txtSource           
= CheckInputStr(upload.form("txtSource"))
        txtOrder            
= CheckInputStr(upload.form("txtOrder"))
        
        
If txtTitle ="" Then
            
Call ShowMessage ("新闻标题一定要填写!","Index.asp",page,Key1,Key2,Key3,Key4)
        
End If    
        
        
set file = upload.file("upfilePic"
        
        
if (upload.CheckFileExt(File.FileName,file.ImgExt) = falsethen
            
Call ShowBackMsg("上传的文件格式不正确,允许上传文件后缀名为:"&file.ImgExt)
        
end if 
        
        
if file.FileSize>0 then
            fileName 
= upload.GetServerFileName(File.FileName)
            fullFilePath 
= File.UploadPath&fileName
            file.SaveToFile Server.mappath(File.UploadPath
&fileName)
        
end if
        
        SQL
="Insert into Web_News (F_Type,F_Title,F_Sender,F_Content,F_Source,F_Order,F_Pic,CreateDate) values ('"&ddlType&"','"&txtTitle&"','"&Session("UserName")&"','"&WebEcitorContent&"','"&txtSource&"','"&txtOrder&"','"&fullFilePath&"','"&now()&"')"
        conn.Execute(SQL)
        
call ShowMessage ("添加成功!","index.asp",page,Key1,Key2,Key3,Key4)
posted @ 2008-11-25 11:24  海底的鱼  阅读(3925)  评论(0)    收藏  举报