Click here to Skip to main content
Click here to Skip to main content

File uploading with COM and ASP

, 6 Aug 2000
Rate this:
Please Sign up or sign in to vote.
A simple COM component with source that provides file upload capabilities for your ASP pages.
<!-- Download Links -->
  • Download demo project - 32 Kb
  • <!-- Main HTML starts here -->

    Introduction

    This article is about file uploading through a COM component (IUploader interface). It uses the IRequest interface to retrieve the information needed.

    There are a bunch of free and comercial solutions, but I wanted to make mine with an easy approach.

    Since you cannot use the request object when you are uploading a file, I created the method GetFormValue to retrieve any variables from a form. You pass the variable name (case sensitive) and it returns the value found.

    To accomplish the file upload and to retrieve any form variable is needed to get the whole buffer from the request object and interpret it. This a basic sample of this buffer:

    -----------------------------7d034c2160334
    Content-Disposition: form-data; name="UploadFile"; filename="C:\SampleFile.txt"
    Content-Type: text/plain
    
    Test file...
    
    -----------------------------7d034c2160334
    Content-Disposition: form-data; name="submit1"
    
    Submit
    -----------------------------7d034c2160334
    Content-Disposition: form-data; name="userName"
    
    me
    -----------------------------7d034c2160334-- 
    

    How to use it

    These are the methods for the IUploader interface:

    Method Description
    StartUpload(IUnknown* pIUnk) This method should be called after the component creation. The pIUnk must be the Request interface
    SetDestinationPath(BSTR bsPath) This method must be called to define where the file will be saved. The directory will be created if it doesn't exists
    GetError(long lError, BSTR* pbsReturn) This method returns the error message for a failed upload. The lError is the return value of a call to UploadFile
    SetMaxFileSize(long lSize) Defines the largest file size to be uploaded (bytes). If lSize is -1 there's no restriction
    GetFormValue(BSTR bsFieldName, BSTR* pbsReturn) Gets the value of a form variable
    UploadFile(BSTR bsFieldName, long* plResult) Uploads a file. If lResult is equal 0 the operation succeeded
    SetAllowedExtensions(SAFEARRAY(VARIANT) FileExtensions) Indicates the allowed extensions. The default value means that all extensions are allowed
    SetForbiddenExtensions(SAFEARRAY(VARIANT) FileExtensions) Defines the forbidden file extensions
    GetUploadFilename(BSTR bsField, BSTR* pbsFilename) Returns the filename of an upload file

    The following VBScript code uploads a file using my component:

    const UploadOK               = 0
    const FilesizeInvalid        = 1
    const ExtensionNotAllowed    = 2
    const DestinationPathInvalid = 3
    const UnknownError           = 4
    const UnableToCreateFile     = 5
    const FileDoesntExist        = 6
    
     
    Set objUploader = Server.CreateObject("InetUtil.Uploader") 
    objUploader.StartUpload(Request)    'passing the IRequest interface for the component
     	
    strUserName = objUploader.GetFormValue("userName")
    objUploader.SetDestinationPath "c:\temp"
    objUploader.SetAllowedExtensions "*"  ' all extensions
    objUploader.SetForbiddenExtensions "exe", "com"
     	
    
    nUploadResult = objUploader.UploadFile("uploadFile")
    

    I could have used an ASP component so I would have the IRequest interface. But I had some problems with this in the past, that's why I don't use this approach. Blush | :O )

    WARNING: There's two known memory leaks that I don't know from where they come. I think it's something about the bad use of COleSafeArray. If you find it please submit.

    In order to use the demo you must have an Win 2K or NT Machine (IIS) because the COM server is an out-of-process. To use it in a Win95/98 machine (PWS) you should create a new in-proc component and then copy the implementation.

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here

    Share

    About the Author

    xicoloko
    Architect VisionOne AG
    Switzerland Switzerland
    XicoLoko is a brazilian developer based in Switzerland.

    Comments and Discussions

     
    QuestionProcess Pinmemberneetugreat200222222222221-Aug-06 22:26 
    GeneralI cannot download the file demo PinmemberJumahijah14-Mar-05 16:49 
    Generalt problem PinsussAnonymous25-Apr-04 17:01 
    Generalttt PinsussAnonymous23-May-03 8:56 
    GeneralDLL Pinmemberfredclown9-Apr-03 9:09 
    GeneralVirus Scanning Uploads PinmemberAndrewpe8-Feb-03 10:52 
    GeneralRe: Virus Scanning Uploads Pinmemberpunahou198027-Mar-08 13:46 
    QuestionWill it work for binary files? Pinmemberjsanjosem25-Dec-02 21:47 
    Generalhelp!! PinmemberAnonymous10-May-02 6:57 
    GeneralRe: help!! Pinmemberxico10-May-02 7:24 
    GeneralAbout MyStrStr fumction Pinmemberstan_lin23-Mar-02 19:44 
    GeneralRe: About MyStrStr fumction Pinmemberxicoloko24-Mar-02 14:50 
    GeneralRe: About MyStrStr fumction Pinmemberstan_lin24-Mar-02 20:26 
    GeneralRe: About MyStrStr fumction Pinmemberxicoloko26-Mar-02 0:58 
    GeneralRe: SAFEARRAY Problem Pinmemberstan_lin26-Mar-02 4:04 
    GeneralMemory leak PinmemberWout Louwers18-Nov-01 23:28 
    GeneralRe: Memory leak Pinmemberprogramsalon28-May-04 17:22 
    Generallibrary not registered PinmemberAnonymous25-Jul-01 11:39 
    GeneralCompiled DLL Pinmembermathe12-Apr-01 0:13 
    QuestionCan anyone send me the compiled DLL PinmemberEduardo21-Mar-01 11:37 
    AnswerRe: Can anyone send me the compiled DLL Pinmemberliangar9-Mar-04 21:29 
    GeneralRe: Can anyone send me the compiled DLL Pinmemberefwefew12-Mar-07 22:50 
    QuestionCan only run on the compter that compiles it? Pinmembercop2c12-Jan-01 7:38 
    AnswerRe: Can only run on the compter that compiles it? PinmemberAnonymous19-Jun-01 11:28 
    AnswerRe: Can only run on the compter that compiles it? PinsussEgyptain29-Nov-02 21:22 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

    | Advertise | Privacy | Terms of Use | Mobile
    Web01 | 2.8.141223.1 | Last Updated 7 Aug 2000
    Article Copyright 2000 by xicoloko
    Everything else Copyright © CodeProject, 1999-2014
    Layout: fixed | fluid