Click here to Skip to main content
15,884,237 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.4K   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

     
    QuestionProcess Pin
    CoderTutorial21-Aug-06 21:26
    CoderTutorial21-Aug-06 21:26 
    GeneralI cannot download the file demo Pin
    Jumahijah14-Mar-05 15:49
    Jumahijah14-Mar-05 15:49 
    Generalt problem Pin
    Anonymous25-Apr-04 16:01
    Anonymous25-Apr-04 16:01 
    Generalttt Pin
    Anonymous23-May-03 7:56
    Anonymous23-May-03 7:56 
    GeneralDLL Pin
    fredclown9-Apr-03 8:09
    fredclown9-Apr-03 8:09 
    GeneralVirus Scanning Uploads Pin
    Andrewpe8-Feb-03 9:52
    Andrewpe8-Feb-03 9:52 
    GeneralRe: Virus Scanning Uploads Pin
    punahou198027-Mar-08 12:46
    punahou198027-Mar-08 12:46 
    QuestionWill it work for binary files? Pin
    jsanjosembet.es25-Dec-02 20:47
    jsanjosembet.es25-Dec-02 20:47 
    Generalhelp!! Pin
    10-May-02 5:57
    suss10-May-02 5:57 
    GeneralRe: help!! Pin
    10-May-02 6:24
    suss10-May-02 6:24 
    GeneralAbout MyStrStr fumction Pin
    23-Mar-02 18:44
    suss23-Mar-02 18:44 
    GeneralRe: About MyStrStr fumction Pin
    xicoloko24-Mar-02 13:50
    xicoloko24-Mar-02 13:50 
    GeneralRe: About MyStrStr fumction Pin
    24-Mar-02 19:26
    suss24-Mar-02 19:26 
    GeneralRe: About MyStrStr fumction Pin
    xicoloko25-Mar-02 23:58
    xicoloko25-Mar-02 23:58 
    GeneralRe: SAFEARRAY Problem Pin
    stan_lin26-Mar-02 3:04
    stan_lin26-Mar-02 3:04 
    GeneralMemory leak Pin
    18-Nov-01 22:28
    suss18-Nov-01 22:28 
    GeneralRe: Memory leak Pin
    pudn.com28-May-04 16:22
    pudn.com28-May-04 16:22 
    Generallibrary not registered Pin
    25-Jul-01 10:39
    suss25-Jul-01 10:39 
    GeneralCompiled DLL Pin
    mathe11-Apr-01 23:13
    mathe11-Apr-01 23:13 
    QuestionCan anyone send me the compiled DLL Pin
    21-Mar-01 10:37
    suss21-Mar-01 10:37 
    AnswerRe: Can anyone send me the compiled DLL Pin
    liangar9-Mar-04 20:29
    liangar9-Mar-04 20:29 
    GeneralRe: Can anyone send me the compiled DLL Pin
    efwefew12-Mar-07 21:50
    efwefew12-Mar-07 21:50 
    QuestionCan only run on the compter that compiles it? Pin
    cop2c12-Jan-01 6:38
    cop2c12-Jan-01 6:38 
    AnswerRe: Can only run on the compter that compiles it? Pin
    19-Jun-01 10:28
    suss19-Jun-01 10:28 
    AnswerRe: Can only run on the compter that compiles it? Pin
    Egyptain29-Nov-02 20:22
    sussEgyptain29-Nov-02 20:22 

    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.