Click here to Skip to main content
15,891,033 members
Articles / Desktop Programming / ATL
Article

File uploading with COM and ASP

Rate me:
Please Sign up or sign in to vote.
4.78/5 (6 votes)
6 Aug 2000 224.6K   2.5K   57   36
A simple COM component with source that provides file upload capabilities for your ASP pages.
  • Download demo project - 32 Kb
  • 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:

    MethodDescription
    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. :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


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

    Comments and Discussions

     
    AnswerNo, only on the computers where you register it Pin
    Vagif Abilov25-Dec-02 21:16
    professionalVagif Abilov25-Dec-02 21:16 
    GeneralFile Date Check Pin
    Kevin Humphreys12-Sep-00 1:05
    Kevin Humphreys12-Sep-00 1:05 
    Generali like it, BUT Pin
    Mike Dalton18-Aug-00 19:11
    Mike Dalton18-Aug-00 19:11 
    GeneralRe: i like it, BUT Pin
    Member 120896517-Sep-00 17:51
    Member 120896517-Sep-00 17:51 
    GeneralRe: i like it, BUT Pin
    1-Feb-02 14:03
    suss1-Feb-02 14:03 
    General:(( Not so free Pin
    Anonymous12-Oct-02 23:18
    Anonymous12-Oct-02 23:18 
    GeneralRe: :(( Not so free Pin
    David Cunningham14-Oct-02 19:07
    cofounderDavid Cunningham14-Oct-02 19:07 
    GeneralRe: i like it, BUT Pin
    9-Aug-01 3:07
    suss9-Aug-01 3:07 
    GeneralRe: i like it, BUT Pin
    dakoen15-Jan-03 21:27
    dakoen15-Jan-03 21:27 
    GeneralNot so strong parsing algorithm... Pin
    <marquee>Lancelot Liao8-Aug-00 17:36
    <marquee>Lancelot Liao8-Aug-00 17:36 

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

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