jeg ville helst gerne undgå komponenter ;P har også selv et scirpt jeg bruegr til upload hvis i kan redigere det så det passer til mit sprg ville det være perfekt..!
-------------------
test_saveasfile.asp
-------------------
<% @ Language = VBScript %>
<%
With Response
    .Buffer = True
    .Expires = 0
    .Clear
End With
%>
<!-- #INCLUDE FILE = "./obj_FileUpload_beta_full.asp" -->
<%
Dim oFO, oProps, oFile, i, item, oMyName
Set oFO = New FileUpload
Set oProps = oFO.GetUploadSettings
with oProps
     'allowable file extensions
    .Extensions = Array("txt", "jpg", "bmp", "zip")
     'upload directory    
    .UploadDirectory = Server.Mappath("uploads/billed")
     'file overwrite option
    .AllowOverWrite = true
     'max file size for EACH file to upload (older versions of the class
     'only check the entire post stream's length once at the beginning)
    .MaximumFileSize = 5000000  ' give or take 135k for each file
     'minimum file size for each file to upload (older versions of the class
     'only check the entire post stream's length once at the beginning)
    .MininumFileSize = 1 ' 10k
     'disable uploading
    .UploadDisabled = false
End with
 'all the properties you set above are remembered by the FileUpload class as soon
 'as they are set so there's no reason not to destroy the FO_Properties object we
 'just used to modify the upload system properties to save memory.
set oProps = nothing
 'default method. Processupload must be called to set everything up. After 
 'ProcessUpload is called, the remaining properties, methods and objects 
 'exposed by fileupload become available and are populated with data.
oFO.ProcessUpload
 'the totalformcount property returns the total count of everything submitted 
 'to the fileupload object. this includes binary input from files and text form 
 'inputs posted from a form.
if oFO.TotalFormCount > 0 then
     'the filecount property returns the count of all binary form inputs that 
     'were read and loaded by the class after ProcessUpload was called. It is
     'not an accurate count of acceptable files, it merely counts the number
     'of binary form inputs parsed.
    if oFO.FileCount > 0 then
         'you can easily use the FileCount property to setup a loop to
         'go through all files that are attempting to be uploaded.
        for i = 1 to oFO.FileCount
             'the fileupload's file object returns a FO_File object
             'containing properties and methods that allow you to
             'view components of the file and perform actions on
             'the file. The File method's argument expects a long
             'integer in the range of 1 to FileCount.
            set oFile = oFO.File(i)            
             'if an error has occurred when the FO_File object was
             'being created or filled with data, it will be in the
             'ErrorMessage property of the returned FO_File object.
            if oFile.ErrorMessage <> "" then
                response.write "> An error occurred uploading a file: " & _
                    oFile.ErrorMessage & "<BR>"
            else
                'rename file
                'oFile.FileName = "newfile.txt" & "." & oFile.FileExtension
                 'there are a couple of different options for
                 'saving files. in this case, i want a copy
                 'of the uploaded file on the server so I use
                 'the saveasfile method.
                oFile.SaveAsFile
                 'after saving an uploaded file using any of the
                 'various save methods available, you should check
                 'the upload successful property to ensure that
                 'the file was saved properly. In the event of an
                 'error during I/O, UploadSuccessful always returns 
                 'false.
                if oFile.UploadSuccessful then                                    
                else
                    response.write "> An error occurred saving file to disk: " & _
                        oFile.ErrorMessage & "<BR>"
                end if
            end if
             'release file object to save memory.        
         'retrieve next file object (if any)
        next
    else        
    end if
     'formcount property of the FileUpload object returns an accurate count
     'of all non-binary form inputs passed to the object.
    if oFO.FormCount > 0 then
         'the inputs method returns an array representing the name of
         'all non-binary form inputs passed.
        if isarray(oFO.Inputs) then                    
else
     'if the totalformcount property returns 0, no input was posted to the page
     'so we might as well show the upload form and give them a chance to upload.
    oFO.ShowUploadForm request.servervariables("SCRIPT_NAME")
end if
filnavn = oFile.FileName
'Open connection and insert user details into the database
%>
<!--#include file="conn.asp"-->
<%
brugernavn = session("brugernavn")
'Then add it to the database.
Set rsUser = Server.CreateObject("ADODB.Recordset")
rsUser.open "filer WHERE brugernavn = '" & brugernavn & "'", conn, 3, 3
rsUser("filnavn") = filnavn
rsUser.addnew
'release FileUpload object to save memory.
set oFile = Nothing
set oFO = Nothing
end if
end if
response.Redirect("../midt.asp")
%>
------------------------------------------------------------------------------------
----------------------------
obj_FileUpload_beta_full.asp
----------------------------
<%
Class FileUpload
    Private UploadRequest, oProps, iFrmCt
    Private iKnownFileCount, iKnownFormCount    
    Private oOutFiles
    Private Sub Class_Initialize
        iFrmCt = 0
        Set oProps = New FO_Properties
        Set UploadRequest = Server.CreateObject("Scripting.Dictionary")
        iKnownFileCount = 0
        iKnownFormCount = 0
        set oOutFiles = Server.CreateObject("Scripting.Dictionary")
    End Sub
    Private Sub Class_Terminate
        set oOutFiles = Nothing
        Set UploadRequest = Nothing
        Set oProps = Nothing
    End Sub
    Public Property Get Version()
        Version = "2.6"
    End Property
    Public Function GetUploadSettings()
        Set GetUploadSettings = oProps
    End Function
    Public Property Get FormCount
        FormCount = iKnownFormCount
    End Property
    Public Property Get FileCount
        FileCount = iKnownFileCount
    End Property
    Public Property Get TotalFormCount
        TotalFormCount = iFrmCt
    End Property
    Private Function GetFormEncType()
        Dim sContType, hCutOff
        sContType = request.servervariables("CONTENT_TYPE")
        hCutOff = instr(sContType, ";")
        if hCutOff > 0 then
            sContType = UCase(Trim(Left(sContType, hCutOff - 1)))
        else
            sContType = UCase(Trim(sContType))
        end if
        GetFormEncType = sContType
    End Function
    Public Default Sub ProcessUpload
    'after processupload is called, totalformcount property, formcount and 
    'filecount properties are filled, form method returns entered data
        Dim RequestBin, oProcess, iTotBytes, key, arr, iKnownProps, oFile
        Dim fofilecheck, sEncType, sReqMeth
        iTotBytes = Request.TotalBytes
        if iTotBytes = 0 then
            iFrmCt = 0
            exit sub
        end if
         ' read posted content(s)
        RequestBin = Request.BinaryRead(iTotBytes)
        '11/14/2001 - test request method and encoding
        '*********************************************************************
        '- You can add your own parsers here by following the same format below.
        '  if the input is a POST, you can add parsing methods to use
        '  by entering a new enctype in the inner select case statement below.
        '
        '  If the input is a GET, you can also add a parser for that condition or
        '  any other request method below by expanding the outer select case statement.
        '
        '- see appendix 1 in the docs for step by step instructions for adding
        '  your own input parsers
        '
        '*********************************************************************
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        '1.) request method check
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        'test request method
        sReqMeth = request.servervariables("REQUEST_METHOD")
        select case UCase(sReqMeth)
            case "POST"
                'determine enctype of form
                ''''''''''''''''''''''''''''''''''''''''''''''''''
                '2.) form encoding method check
                ''''''''''''''''''''''''''''''''''''''''''''''''''
                'test form encoding type
                sEncType = GetFormEncType
                select case sEncType
                    case "MULTIPART/FORM-DATA"
                         ' call BuildUploadRequest to parse binary info
                        Set oProcess = New FO_Processor
                        oProcess.BuildUploadRequest  RequestBin, UploadRequest
                        Set oProcess = Nothing
                    case "APPLICATION/X-WWW-FORM-URLENCODED"
                         ' call ascii form processor
                        Set oProcess = New FO_Processor
                        oProcess.BuildUploadRequest_ASCII oProcess.getString(RequestBin), UploadRequest
                        Set oProcess = Nothing
                    case else
                        'do nothing with unknown enc types
                end select
            case "GET"
                'do nothing with querystring inputs...
                'To create your own GET parser, let IIS do the hard work for you
                'and just retrieve the QUERY_STRING environment variable
                'and then pass it to a new method in the FO_Processor object
                'that will process it...
                '
                '    inputs_to_parse = Request.ServerVariables("QUERY_STRING")
                '     ' call my query string processor
                '    Set oProcess = New FO_Processor
                '    oProcess.MyQueryStringProcessor inputs_to_parse, UploadRequest
                '    Set oProcess = Nothing
                '
            case else
                'do nothing with other request methods
        end select
        arr = uploadrequest.keys
        if not isarray(arr) then
            iFrmCt = 0
            exit sub
        end if
        iFrmCt = ubound(arr)
        for each key in arr
            if isobject(uploadrequest.item(key)) then
                iKnownProps = ubound(uploadrequest.item(key).keys) + 1
                if iKnownProps = 4 then
                    'it's a file
                    iKnownFileCount = iKnownFileCount + 1
                    set fofilecheck = new FO_FileChecker
                    fofilecheck.SetCurrentProperties oProps
                    fofilecheck.FileInput_NamePath = uploadrequest.item(key).item("FileName")
                    fofilecheck.FileInput_ContentType = uploadrequest.item(key).item("ContentType")
                    fofilecheck.FileInput_BinaryText = uploadrequest.item(key).item("Value")
                    fofilecheck.FileInput_FormInputName = uploadrequest.item(key).item("InputName")
                    set oFile = fofilecheck.ValidateVerifyReturnFile()
                    set fofilecheck = nothing
                    oOutFiles.add iKnownFileCount, oFile
                    set oFile = nothing
                    uploadrequest.remove key
                elseif iKnownProps = 2 then
                    'it's a form input
                    iKnownFormCount = iKnownFormCount + 1
                else
                    'i have no idea what it is
                end if
            end if
        next
    End Sub
    Public Function File(ByVal blobName)
        'version 2.5 allows an input name as well as an integer between
        '1 and FileCount.
        Dim blobs, blob, subdict, tmpName
        'new addition for 2.5 adds inputname to internal blob number
        'processing step which searches all keys for the entered name
        'first. if found, substitutes the number of the blobname entered
        'for the ordinal internal blob number. If not found, processing
        'continues as usual.
        blobs = oOutFiles.Keys
        For Each blob In blobs
            'this is a FO_File object
            Set subdict = oOutFiles.Item(blob)
            tmpName = subdict.frmInputName
            If UCase(Trim(tmpName)) = UCase(Trim(blobName)) Then
                blobName = blob
                Exit For
            End If
        Next
        'old version 2.0 way
        if isobject(oOutFiles.Item(blobName)) then
            Set File = oOutFiles.Item(blobName)
        else
            Set File = Nothing
        end if
    End Function
    Public Function Form(ByVal inputName)
        if isobject(UploadRequest.Item(inputName)) then
            Form = UploadRequest.Item(inputName).Item("Value")
        else
            Form = ""
        end if
    End Function
    Public Function FormLen(ByVal inputName)
        if isobject(UploadRequest.Item(inputName)) then
            FormLen = Len(UploadRequest.Item(inputName).Item("Value"))
        else
            FormLen = 0
        end if
    End Function
    Public Function FormEx(ByVal inputName, ByVal vDefaultValue)
        dim vTmp
        if isobject(UploadRequest.Item(inputName)) then
            vTmp = UploadRequest.Item(inputName).Item("Value")
            if len(trim(CStr(vTmp))) = 0 then
                FormEx = vDefaultValue
                Exit Function
            end if
            FormEx = vTmp
            Exit Function
        end if
        FormEx = vDefaultValue
    End Function
    Public Function Inputs()
        if isobject(UploadRequest) then
            Inputs = UploadRequest.keys
        else
            Inputs = ""
        end if
    End Function
    Public Sub ShowUploadForm(ByVal sSubmitPage)
         ' display the upload form and let the 
         ' user know what they can and cannot upload
        Dim tmp, item
        With Response
            .Write("<P>You can currently add any file of type: ")
            tmp = ""
            If IsArray(oProps.Extensions) Then
                For Each Item In oProps.Extensions
                    tmp = tmp & "<CODE>*." & Item & "</CODE>, "
                Next
                tmp = left( tmp, Len(tmp) - 2 )
            End If
            .Write(tmp & "<BR>")
            .Write("Each file must have a maximum size of: <CODE>~ ")
            .Write(Round( oProps.MaximumFileSize / 1024, 1 ) & " k</CODE> ")
            .Write("and a minimum size of: <CODE>~ ")
            .Write(FormatNumber(Round( oProps.MininumFileSize _
                / 1024, 1 ), 1) & " k.</CODE></P>")
            .Write("</P>")
            .Write("<FORM ENCTYPE=""multipart/form-data"" ACTION=""")
            .Write(sSubmitPage & """ METHOD=""POST"">" & vbCrLf)
            .Write("Please select a file to upload ")
            if oProps.UploadDisabled Then
                .Write("from your computer [upload is disabled]:<BR>" & vbCrLf)
                .Write("<INPUT TYPE=FILE NAME=""blob"" DISABLED><BR><BR>" & vbCrLf)
            Else
                .Write("from your computer:")
                .Write(" [Upload is optional]")
                .Write("<BR>" & vbCrLf)
                .Write("<INPUT TYPE=FILE NAME=""blob""><BR><BR>" & vbCrLf)
            End If
            .Write("Please enter your full name:<BR>" & vbCrLf)
            .Write("<INPUT TYPE=TEXT NAME=""myName"" SIZE=35><BR><BR>" & vbCrLf)
            .Write("<INPUT TYPE=SUBMIT VALUE=""Upload File"">" & vbCrLf)
            .Write("</FORM>" & vbCrLf)
        End With
    End Sub
End Class
Class FO_FileChecker
    Private oProps, sFileName, hFileBinLen, sFileBin, sFileContentType, sFileFormInputName
    Private Sub Class_Initialize()
        'initialize everything to the "bad" settings
        sFileName = ""
        hFileBinLen = 0
        sFileBin = ""
        sFileContentType = ""
    End Sub
    Public Sub SetCurrentProperties(byref oPropertybag)
        Set oProps = oPropertybag
    End Sub
    Public Property Let FileInput_FormInputName(ByVal fname)
        sFileFormInputName = fname
    End Property
    Public Property Let FileInput_NamePath(ByVal fname)
        Dim realfilename
        '** parse the file name minus any directory path from the input path
        realfilename = Right(fname, Len(fname) - InstrRev(fname,"\"))
        sFileName = trim(realfilename)
    End Property
    Public Property Let FileInput_ContentType(ByVal conttype)
        sFileContentType = conttype
    End Property
    Public Property Let FileInput_BinaryText(ByVal binstring)
        Dim  binlen
        binlen = lenb(binstring)
        hFileBinLen = binlen
        sFileBin = binstring
    End Property
    Public Function ValidateVerifyReturnFile()    'As FO_File
        'call all the validation methods.
        'if any fail, fill the FO_File object
        'accordingly and stop processing
        if IllegalCharsFound then
            Set ValidateVerifyReturnFile = FillFOFileObj(false, "", "", "bad character in file name", "", "", "", sFileFormInputName)
            Exit Function
        end if
        if FileNameBadOrExists then
            Set ValidateVerifyReturnFile = FillFOFileObj(false, "", "", "file name bad or non-existent or file with same name already exists and overwrite disabled", "", "", "", sFileFormInputName)
            Exit Function
        end if
        If FileExtensionIsBad then
            Set ValidateVerifyReturnFile = FillFOFileObj(false, "", "", "file extension is not allowed or doesn't exist", "", "", "", sFileFormInputName)
            Exit Function
        End If
        If FileSizeIsBad then
            Set ValidateVerifyReturnFile = FillFOFileObj(false, "", "", "file size is either too large or too small", "", "", "", sFileFormInputName)
            Exit Function
        end if
        Set ValidateVerifyReturnFile = FillFOFileObj(false, "", "", "", sFileContentType, sFileName, sFileBin, sFileFormInputName)
    End Function
    Private Function FillFOFileObj(byval success, byval abspath, byval virpath, byval stderr, byval contenttype, byval fname, byval binarytext, byval forminputname)
        'create FO_File object    
        Dim oFile
        set oFile = New FO_File
        oFile.SetCurrentProperties oProps
        oFile.bSuccess = success
        oFile.sAbsPath = abspath
        oFile.sVirPath = virpath
        oFile.sStdErr = stderr
        oFile.sCType = contenttype
        oFile.sFileName = fname
        oFile.binValue = binarytext
        oFile.frmInputName = forminputname
        set FillFOFileObj = oFile
    End Function    
    'added illegal character check...
    Public Function IllegalCharsFound()
        '** test file name for illegal characters
        Dim re
        set re = new regexp
        re.pattern = "\\\/\:\*\?\""\<\>\|"
        re.global = true
        re.ignorecase = true
        if re.test(sFileName) then
            IllegalCharsFound = true
        else
            IllegalCharsFound = false
        end if
        set re = nothing
    End Function
    Public Function FileNameBadOrExists()
        Dim absuploaddirectory, oFSO
        '** test file name length
        if len(trim(sFileName)) = 0 then
            FileNameBadOrExists = true
            Exit Function
        end if        
        'repaired this block to only get the file system involved if necessary.
        'if allowing overwrite, who cares. otherwise, see if file exists.
        'considered not valid if file exists
        if oProps.AllowOverWrite then
            FileNameBadOrExists = false
            Exit Function
        end if
        absuploaddirectory = oProps.uploaddirectory & "\" & trim(sFileName)
        '** test for file exists, if necessary
        set oFSO = server.createobject("Scripting.FileSystemObject")
        if oFSO.FileExists(absuploaddirectory) then
            FileNameBadOrExists = true
        else
            FileNameBadOrExists = false
        end if
        Set oFSO = Nothing
    End Function
    Public Function FileExtensionIsBad()
        Dim sFileExtension, bFileExtensionIsValid, sFileExt
        '** parse for file type extension
        if len(trim(sFileName)) = 0 then
            FileExtensionIsBad = true
            Exit Function
        end if
        sFileExtension = right(sFileName, len(sFileName) - instrrev(sFileName, "."))
        bFileExtensionIsValid = false    'assume extension is bad
        for each sFileExt in oProps.extensions
            if ucase(sFileExt) = ucase(sFileExtension) then
                'if the extensions match, it's good. stop checking
                bFileExtensionIsValid = True
                exit for
            end if
        next
        FileExtensionIsBad = not bFileExtensionIsValid
    End Function
    Public Function FileSizeIsBad()
        if hFileBinLen > oProps.MaximumFileSize then
            FileSizeIsBad = True
            Exit Function
        end if
        if hFileBinLen < oProps.MininumFileSize then
            FileSizeIsBad = True
            Exit Function
        end if
        FileSizeIsBad = False
    End Function
End Class
Class FO_Processor
     ' #########################################################
     ' # UPLOAD ROUTINES                                       #
     ' # For detailed information about these routines, go to: #
     ' # 
http://www.asptoday.com/articles/20000316.htm         #
     ' #########################################################
    Private Function getByteString(byval StringStr)
         ' For detailed information about this routine, go to:
         ' 
http://www.asptoday.com/articles/20000316.htm        dim char, i
        For i = 1 to Len(StringStr)
            char = Mid(StringStr, i, 1)
            getByteString = getByteString & chrB(AscB(char))
        Next
    End Function
    Public Function getString(byval StringBin)
         ' For detailed information about this routine, go to:
         ' 
http://www.asptoday.com/articles/20000316.htm        dim intCount
        getString =""
        For intCount = 1 to LenB(StringBin)
            getString = getString & chr(AscB(MidB(StringBin, intCount, 1))) 
        Next
    End Function
    Public Sub BuildUploadRequest_ASCII(ByVal sPostStr, ByRef UploadRequest) 
        dim i, j, blast, sName, vValue
        dim tmphash
        blast = false
        i = -1
        do while i <> 0
            if i = -1 then
                i = 1
            else
                i = i + 1
            end if
            j = instr(i, sPostStr, "=") + 1
            sName = mid(sPostStr, i, j-i-1)
            i = instr(j, sPostStr, "&")
            if i = 0 then 
                vValue = mid(sPostStr, j)
            else
                vValue = mid(sPostStr, j, i - j)
            end if
            Dim uploadcontrol
            set uploadcontrol = createobject("Scripting.Dictionary")
            uploadcontrol.add "Value", vValue
            if not uploadrequest.exists(sName) then
                uploadrequest.add sName, uploadcontrol
            else
                set tmphash = uploadrequest(sName)
                tmphash("Value") = tmphash("Value") & ", " & vValue
                set uploadrequest(sName) = tmphash
            end if
        loop
    End Sub
    Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
         ' For detailed information about this routine, go to:
         ' 
http://www.asptoday.com/articles/20000316.htm        dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
        dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
        dim tmphash, isfile
        'zero byte check
        if lenb(RequestBin) = 0 then 
            '7/23/01 - zero byte check
            'no form data posted
            exit sub
        end if
        PosBeg = 1
        PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
        if posend = 0 then
            '7/23/01 - no binary input passed check
            'translate binary to ascii and transfer control
            'to the regular form parser.
            BuildUploadRequest_ASCII getString(requestbin), UploadRequest
            Exit Sub
        end if
        boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
        boundaryPos = InstrB(1,RequestBin,boundary)
        Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
            Dim UploadControl
            Set UploadControl = Server.CreateObject("Scripting.Dictionary")
            Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
            Pos = InstrB(Pos,RequestBin,getByteString("name="))
            PosBeg = Pos+6
            PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
            Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
            PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
            PosBound = InstrB(PosEnd,RequestBin,boundary)
            isfile = false
            If  PosFile<>0 AND (PosFile<PosBound) Then
                PosBeg = PosFile + 10
                PosEnd =  InstrB(PosBeg,RequestBin,getByteString(chr(34)))
                FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
                UploadControl.Add "FileName", FileName
                Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
                PosBeg = Pos+14
                PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
                ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
                UploadControl.Add "ContentType",ContentType
                PosBeg = PosEnd+4
                PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
                Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
                isfile = true
            Else
                Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
                PosBeg = Pos+4
                PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
                Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
                isfile = false
            End If
            UploadControl.Add "Value" , Value
            UploadControl.Add "InputName", Name
            if not uploadrequest.exists(name) then 
                '7/22/01 - added check to see if top level input name already
                'exists to prevent bombing if 2 inputs have the same name.
                'Now, if this situation occurs, the first input is always used
                'and any other inputs with the same name are discarded.
                UploadRequest.Add name, UploadControl    
            else
                if not isfile then
                    set tmphash = uploadrequest(name)
                    tmphash("Value") = tmphash("Value") & ", " & Value
                    set uploadrequest(name) = tmphash
                end if
            end if
            BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
        Loop
    End Sub
End Class
Class FO_File
    Public bSuccess
    Public sAbsPath
    Public sVirPath
    Public sStdErr
    Public sCType
    Public frmInputName
    Public binValue
    Private hBtCt, sURiPath, sFiExt
    private sfinme
    Private oProps
    Public property let sFileName(byval filenameinput)
        'resolve extension
        sFiExt = right(filenameinput, len(filenameinput) - instrrev(filenameinput, "."))
        sfinme = filenameinput
    end property
    public property get sFileName()
        sFileName = sfinme
    end property
    Private Sub Class_Initialize()
        bSuccess = false
        sAbsPath = ""
        sVirPath = ""
        sStdErr = ""
        hBtCt = 0
        sCType = ""
        sFileName = ""
        binValue = ""
        sURiPath = ""
    End Sub
    Public Sub SetCurrentProperties(byref oPropertybag)
        Set oProps = oPropertybag
    End Sub
    Public Sub SaveAsRecord(byref oField)
        sAbsPath = ""
        sVirPath = ""
        sURiPath = ""
        bSuccess = false
        If LenB(binValue) = 0 Then 
            Exit Sub
        End If
        if oProps.UploadDisabled then
            sStdErr = "Uploading disabled by administrator"
            Exit Sub
        end if        
        If IsObject(oField) Then
            '8/18/2001 - added some error handling to try to
            'catch errors when trying to add blobs to a
            'ms access 97 database (which doesn't support them)
            On Error Resume Next
            oField.AppendChunk binValue
            if Err Then
                sStdErr = Err.Description
                bBtCt = 0
                bSuccess = false
                Exit Sub
            end if
            On Error GoTo 0
            hBtCt = lenb(binValue)
            bSuccess = true
        End If
    End Sub
    Public Sub SaveAsFile()
        If sStdErr <> "" Then
            exit sub
        end if
        'upload file
        WriteUploadFile oProps.uploaddirectory & "\" & sFileName, binValue
    End Sub
    Public Function SaveAsBinaryString()
        If LenB(binValue) = 0 Then 
            bBtCt = 0
            bSuccess = false
            Exit Function
        End If
        if oProps.UploadDisabled then
            bBtCt = 0
            bSuccess = false
            sStdErr = "Uploading disabled by administrator"
            Exit Function
        end if
        SaveAsBinaryString = binValue
        hBtCt = lenb(binValue)
        bSuccess = true
    End Function
    Public Function SaveAsString()
        Dim outstr, i
        If LenB(binValue) = 0 Then 
            bBtCt = 0
            bSuccess = false
            Exit Function
        End If
        if oProps.UploadDisabled then
            bBtCt = 0
            bSuccess = false
            sStdErr = "Uploading disabled by administrator"
            Exit Function
        end if
        ' translate binary data into ASCII 
        outstr = ""
        For i = 1 to LenB( binValue )
            outstr = outstr & chr( AscB( MidB( binValue, i, 1) ) )
        Next
        SaveAsString = outstr
        hBtCt = lenb(binValue)
        bSuccess = true
    End Function
    Public Function SaveAsBase64EncodedStr()
        Dim outstr, oEnc
        If LenB(binValue) = 0 Then 
            bBtCt = 0
            bSuccess = false
            Exit Function
        End If
        if oProps.UploadDisabled then
            bBtCt = 0
            bSuccess = false
            sStdErr = "Uploading disabled by administrator"
            Exit Function
        end if
        'base 64 encode ASCII
        Set oEnc = New Base64Encoder
        outstr = oEnc.EncodeStr(binValue)
        Set oEnc = Nothing
        SaveAsBase64EncodedStr = outstr
        hBtCt = lenb(binValue)
        bSuccess = true
    End Function
    Private Sub WriteUploadFile(byVal NAME, byVal CONTENTS)
         ' create the file on the server
        dim ScriptObject, i, NewFile
        on error resume next
        if oProps.UploadDisabled then
            err.raise "31234", "FO Obj", "Uploading disabled by administrator"
        else
            Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
            Set NewFile = ScriptObject.CreateTextFile( NAME )
            For i = 1 to LenB( CONTENTS )
                 ' translate binary data into ASCII 
                 ' characters and write them into the file.
                NewFile.Write chr( AscB( MidB( CONTENTS, i, 1) ) )
            Next
            NewFile.Close
            Set NewFile = Nothing
            Set ScriptObject = Nothing
        end if
        if err.number <> 0 then
            sStdErr = Err.Description
            bSuccess = false
        else
            sAbsPath = NAME
            sVirPath = UnMappath(NAME)
            hBtCt = lenb(CONTENTS)
            sURiPath = "
http://" & request.servervariables("HTTP_HOST") & sVirPath
            bSuccess = true
        end if
        on error goto 0
    End Sub
    Private Function UnMappath(byVal pathname)
        '
http://aspemporium.com/aspEmporium/codelib/codelib.asp?pid=8&cid=8        dim tmp, strRoot
        strRoot = Server.Mappath("/")
        tmp = replace( lcase( pathname ), lcase( strRoot ), "" )
        tmp = replace( tmp, "\", "/" )
        UnMappath = tmp
    End Function
    Public Property Get ContentType()
        ContentType = sCType
    End Property
    Public Property Let FileName(byval newfilename)
        'store in: sFileName
        'after validating
        'test new filename - on error, filename
        'remains what it was when entered if an
        'upload is attempted after an unsuccessful
        'rename.
        Dim oFileChk
        set oFileChk = New FO_FileChecker
        oFileChk.SetCurrentProperties oProps
        oFileChk.FileInput_NamePath = newfilename
        if oFileChk.IllegalCharsFound Then
            sStdErr = "illegal characters found in new file name"
            bSuccess = false
            set oFileChk = Nothing
            Exit Property
        end if
        if oFileChk.FileNameBadOrExists Then
            sStdErr = "file name is bad or file with same name already exists and overwrite disabled"
            bSuccess = false
            set oFileChk = Nothing
            Exit Property
        End If
        if oFileChk.FileExtensionIsBad Then
            sStdErr = "file extension is not allowed or doesn't exist"
            bSuccess = false
            set oFileChk = Nothing
            Exit Property
        End If
        Set oFileChk = Nothing
        'reset filename to new file name if passes all tests
        sStdErr = ""
        sFileName = newfilename
    End Property
    Public Property Get FileExtension()
        FileExtension = sFiExt
    End Property
    Public Property Get FileNameWithoutExtension()
        'chop any/all extensions from the filename and return just the file name without the extension
        FileNameWithoutExtension = StripFileExtensionFromFileName(sFileName)
    End Property
    Public Function StripFileExtensionFromFileName(ByVal filenametostrip)
        Dim hExtensionStart, tmpfilenametoalter
        tmpfilenametoalter = filenametostrip
        hExtensionStart = -1
        do while not hExtensionStart = 0
            hExtensionStart = instrrev(tmpfilenametoalter, ".")
            if hExtensionStart > 0 then
                tmpfilenametoalter = left(tmpfilenametoalter, hExtensionStart - 1)
            end if
        loop
        StripFileExtensionFromFileName = tmpfilenametoalter
    End Function
    Public Function JoinFileExtensionToFileName(ByVal filenametojoin, byval fileextensiontojoin)
        Dim strippedfilename
        strippedfilename = StripFileExtensionFromFileName(filenametojoin)
        JoinFileExtensionToFileName = strippedfilename & "." & fileextensiontojoin
    End Function
    Public Function GetFileNameFromFilePath(ByVal filewithpath)
        dim fileend
        fileend = instrrev(filewithpath, "\")
        GetFileNameFromFilePath = right(filewithpath, len(filewithpath) - fileend)
    End Function
    Public Property Get FileName()
        FileName = sFileName
    End Property
    Public Property Get UploadSuccessful()
        UploadSuccessful = bSuccess
    End Property
    Public Property Get AbsolutePath()
        AbsolutePath = sAbsPath
    End Property
    Public Property Get URLPath()
        URLPath = sURiPath
    End Property
    Public Property Get VirtualPath()
        VirtualPath = sVirPath
    End Property
    Public Property Get ErrorMessage()
        ErrorMessage = sStdErr
    End Property
    Public Property Get ByteCount()
        ByteCount = hBtCt
    End Property
End Class
Class FO_Properties
    Private sErrHead        'string
    Private sErrMsg            'string
    Private arrExt            'variant - array
    Private strUploadDir        'string
    Private boolAllowOverwrite    'boolean
    Private lngUploadSize        'long
    Private bMin            'long
    Private bByPass            'boolean
    Private Sub Class_Initialize()
        sErrHead = "FileUpload Object - Invalid Property Setting"
        sErrMsg = ""
        arrExt = Array("txt", "htm", "html", "zip", "inc")
        strUploadDir = Server.Mappath("/")
        boolAllowOverwrite = false
        lngUploadSize = 100000
        bMin = 1024
        bByPass = false
    End Sub
    Public Sub ResetAll()
        Class_Initialize
    End Sub
    Public Property LET Extensions(byVal arrayInput)
        dim item, bErr
        bErr = false
        if isarray(arrayInput) then
            'check array
            for each item in arrayInput
                if instr(item, ".") <> 0 then
                    bErr = true
                    exit for
                end if
            next
            if not bErr then
                arrExt = arrayInput
                Exit Property
            else
                arrayInput = ""
            end if
        end if
        sErrMsg = "Extensions property input must be an array of extensions without the dot(.)."
        if arrayInput = "*" then
            Err.Raise 21340, sErrHead, sErrMsg & _
                " The Wildcard is no longer supported as an option."
        else
            Err.Raise 21341, sErrHead, sErrMsg
        end if
    End Property
    Public Property LET UploadDirectory(byVal strInput)
        Dim oFSO, bDoesntExist
        bDoesntExist = false
        if instr(strInput, "/") <> 0 then
            strInput = ""
            Err.Raise 21342, sErrHead, _
                "UploadDirectory property - absolute path required for this property."
            exit property
        end if
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        if not oFSO.FolderExists(strInput) then bDoesntExist = true
        set oFSO = Nothing
        if bDoesntExist then
            Err.Raise 21343, sErrHead, "UploadDirectory property - """ & _
                strInput & """ directory doesn't exist on the server."
            Exit Property
        end if
        strUploadDir = strInput
    End Property
    Public Property LET AllowOverWrite(byVal boolInput)
        on error resume next
        boolInput = cbool(boolInput)
        on error goto 0
        boolAllowOverwrite = boolInput
    End Property
    Public Property LET MaximumFileSize(byVal lngInput)
        if isnumeric(lngInput) then
            on error resume next
            lngInput = CLng( lngInput )
            on error goto 0
            lngUploadSize = lngInput
            exit property
        end if
        Err.Raise 21344, sErrHead, "MaximumFileSize Property must be a long integer."
    End Property
    Public Property LET MininumFileSize(byVal lngInput)
        if isnumeric(lngInput) then
            on error resume next
            lngInput = CLng( lngInput )
            on error goto 0
            bMin = lngInput
            exit property
        end if
        Err.Raise 21345, sErrHead, "MininumFileSize Property must be a long integer."
    End Property
    Public Property LET UploadDisabled(byval boolInput)
        on error resume next
        boolInput = cbool(boolInput)
        on error goto 0
        bByPass = boolInput
    End Property
    Public Property GET UploadDisabled()
        UploadDisabled = bByPass
    End Property
    Public Property GET MininumFileSize()
        MininumFileSize = bMin
    End Property
    Public Property GET Extensions()
        Extensions = arrExt
    End Property
    Public Property GET UploadDirectory()
        UploadDirectory = strUploadDir
    End Property
    Public Property GET AllowOverWrite()
        AllowOverWrite = boolAllowOverwrite
    End Property
    Public Property GET MaximumFileSize()
        MaximumFileSize = lngUploadSize
    End Property
End Class
Class Base64Encoder
    'written for vb by: webmaster@q-tec.org
    'and converted by bill <support@aspemporium.com> for
    'the CCVerification class and brought over to the
    'FileUpload class
    Private Base64Chars
    Private Sub Class_Initialize()
        Base64Chars =    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
                "abcdefghijklmnopqrstuvwxyz" & _
                "0123456789" & _
                "+/"
    End Sub
    Public Function EncodeStr(byVal strIn)
        Dim c1, c2, c3, w1, w2, w3, w4, n, strOut
        For n = 1 To Len(strIn) Step 3
            c1 = Asc(Mid(strIn, n, 1))
            c2 = Asc(Mid(strIn, n + 1, 1) + Chr(0))
            c3 = Asc(Mid(strIn, n + 2, 1) + Chr(0))
            w1 = Int(c1 / 4) : w2 = (c1 And 3) * 16 + Int(c2 / 16)
            If Len(strIn) >= n + 1 Then 
                w3 = (c2 And 15) * 4 + Int(c3 / 64) 
            Else 
                w3 = -1
            End If
            If Len(strIn) >= n + 2 Then 
                w4 = c3 And 63 
            Else 
                w4 = -1
            End If
            strOut = strOut + mimeencode(w1) + mimeencode(w2) + _
                      mimeencode(w3) + mimeencode(w4)
        Next
        EncodeStr = strOut
    End Function
    Private Function mimedecode(byVal strIn)
        If Len(strIn) = 0 Then 
            mimedecode = -1 : Exit Function
        Else
            mimedecode = InStr(Base64Chars, strIn) - 1
        End If
    End Function
    Public Function DecodeStr(byVal strIn)
        Dim w1, w2, w3, w4, n, strOut
        For n = 1 To Len(strIn) Step 4
            w1 = mimedecode(Mid(strIn, n, 1))
            w2 = mimedecode(Mid(strIn, n + 1, 1))
            w3 = mimedecode(Mid(strIn, n + 2, 1))
            w4 = mimedecode(Mid(strIn, n + 3, 1))
            If w2 >= 0 Then _
                strOut = strOut + _
                    Chr(((w1 * 4 + Int(w2 / 16)) And 255))
            If w3 >= 0 Then _
                strOut = strOut + _
                    Chr(((w2 * 16 + Int(w3 / 4)) And 255))
            If w4 >= 0 Then _
                strOut = strOut + _
                    Chr(((w3 * 64 + w4) And 255))
        Next
        DecodeStr = strOut
    End Function
    Private Function mimeencode(byVal intIn)
        If intIn >= 0 Then 
            mimeencode = Mid(Base64Chars, intIn + 1, 1) 
        Else 
            mimeencode = ""
        End If
    End Function
End Class
%>