Multiple files upload while updating DB

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • MoroccoIT
    New Member
    • May 2009
    • 9

    Multiple files upload while updating DB

    Greetings -

    I saw somewhat similar code (pls see link below) that does mupltiple files upload. It works fine, but I wanted to populate the database with the same files that are uploaded to mydirectory, but for some reason, I am getting different file names on the database.


    Here is the full code: please do serach on kewword "database" to see where I added my database code - that where I need help with.

    And here the link where I got it from:


    Thank you so much for any input you can provide

    @Karim


    Code:
    <!---
    Set the number of files that can uploaded in a single
    form submission.
    --->
    <cfset REQUEST.FileCount = 5 />
     
    
    <!--- Set the destination folder for uploads. --->
    <cfset REQUEST.UploadPath = ExpandPath( "./uploads/" ) />
     
    
    <!--- Param the appropriate number of file fields. --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
     
    
    <!--- Param file value. --->
    <cfparam
    name="FORM.file#intFileIndex#"
    type="string"
    default=""
    />
     
    
    </cfloop>
     
    
     
    
    <!--- Param upload flag. --->
    <cftry>
    <cfparam
    name="FORM.submitted"
    type="numeric"
    default="0"
    />
     
    
    <cfcatch>
    <cfset FORM.submitted = 0 />
    </cfcatch>
    </cftry>
     
    
     
    
    <!--- Set up an array to hold errors. --->
    <cfset arrErrors = ArrayNew( 1 ) />
     
    
     
    
    <!--- Check to see if the form has been submitted. --->
    <cfif FORM.submitted>
     
    
    <!---
    Here is where we would validate the data; however,
    in this example, there really isn't anything to
    validate. In order to validate something, we are going
    to require at least one file to be uploaded!
    --->
     
    
     
    
    <!---
    Since we are going to require at least one file, I am
    going to start off with an error statement. Then, I am
    gonna let the form tell me to DELETE IT.
    --->
    <cfset ArrayAppend(
    arrErrors,
    "Please select at least one file to upload"
    ) />
     
    
     
    
    <!--- Loop over the files looking for a valid one. --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
     
    
    <cfif Len( FORM[ "file#intFileIndex#" ] )>
     
    
    <!--- Clear the errors array. --->
    <cfset ArrayClear( arrErrors ) />
     
    
    <!--- Break out of loop. --->
    <cfbreak />
     
    
    </cfif>
     
    
    </cfloop>
     
    
     
    
    <!---
    Check to see if there were any form validation
    errors. If there are no errors, then we can continue
    to process the form. Otherwise, we are going to skip
    this and just let the page render again.
    --->
    <cfif NOT ArrayLen( arrErrors )>
     
    
    <!---
    Create an array to hold the list of uploaded
    files.
    --->
    <cfset arrUploaded = ArrayNew( 1 ) />
     
    
     
    
    <!---
    Loop over the form fields and upload the files
    that are valid (have a length).
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
     
    
    <!--- Check to see if file has a length. --->
    <cfif Len( FORM[ "file#intFileIndex#" ] )>
     
    
    <!---
    When uploading, remember to use a CFTry /
    CFCatch as complications might be encountered.
    --->
    <cftry>
    <cffile
    action="upload"
    destination="#REQUEST.UploadPath#"
    filefield="file#intFileIndex#"
    nameconflict="makeunique"
    />
     
    
    <!---
    Store this file name in the uploaded file
    array so we can reference it later.
    --->
    <cfset ArrayAppend(
    arrUploaded,
    (CFFILE.ServerDirectory & "\" & CFFILE.ServerFile)
    ) />
     
    <!---  Store file names in the database --->
    <CFQUERY NAME="CreateDocumentRecord" DATASOURCE="mydb">
       INSERT INTO Uploads (user_ID, File_Name, Date_Published)
       VALUES (#Form.ClientID#, 'file#intFileIndex#', #Now()#)
    </CFQUERY>
    
    
    
    <!--- #FILE.ClientFile# #intFileIndex# File_Name, #intFileIndex#--->
    
    
    <!--- Catch upload errors. --->
    <cfcatch>
     
    
    <!--- Store the error. --->
    <cfset ArrayAppend(
    arrErrors,
    "There was a problem uploading file ###intFileIndex#: #CFCATCH.Message#"
    ) />
     
    
    <!---
    Break out of the upload loop as we
    don't want to deal with any more
    files than we have to.
    --->
    <cfbreak />
     
    
    </cfcatch>
    </cftry>
     
    
    </cfif>
     
    
    </cfloop>
     
    
     
    
    <!--- Check to see if we have any form errors. --->
    <cfif ArrayLen( arrErrors )>
     
    
     
    
    <!---
    We encountered an error somewhere in the upload
    process. As such, we want to clean up the server
    a bit by deleteing any files that were
    successfully uploaded as part of this process.
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#ArrayLen( arrUploaded )#"
    step="1">
     
    
    <!--- Try to delete this file. --->
    <cftry>
    <cffile
    action="delete"
    file="#arrUploaded[ intFileIndex ]#"
    />
     
    
    <cfcatch>
    <!--- File could not be deleted. --->
    </cfcatch>
    </cftry>
     
    
    </cfloop>
     
    
     
    
    <cfelse>
     
    
     
    
    <!---
    !! SUCCESS !!
    The files were properly uploaded and processed.
    Here is where you might forward someone to some
    sort of success / confirmation page.
    --->
     
    
     
    
    </cfif>
     
    
    </cfif>
     
    
    </cfif>
     
    
     
    
    <!--- Set the content type and reset the output buffer. --->
    <cfcontent
    type="text/html"
    reset="true"
    />
     
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
    <title>Multiple File Uploads</title>
    </head>
    <body>
     
    
    <cfoutput>
     
    
    <h1>
    Multiple File Upload ColdFusion Example
    </h1>
     
    
     
    
    <!--- Check to see if we have any errors to display. --->
    <cfif ArrayLen( arrErrors )>
     
    
    <p>
    Please review the following errors:
    </p>
     
    
    <ul>
    <cfloop
    index="intError"
    from="1"
    to="#ArrayLen( arrErrors )#"
    step="1">
     
    
    <li>
    #arrErrors[ intError ]#
    </li>
     
    
    </cfloop>
    </ul>
     
    
    </cfif>
     
    
     
    
    <form
    action="#CGI.script_name#"
    method="post"
    enctype="multipart/form-data">
     
    
    <!--- Submission flag. --->
    <input type="hidden" name="ClientID" value="163">
    <input type="hidden" name="submitted" value="1" />
     
    
     
    
    <!---
    Loop over the number of files we are going to
    allow for the upload.
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
     
    
    <label for="file#intFileIndex#">
    File #intFileIndex#:
    </label>
     
    
    <input
    type="file"
    name="file#intFileIndex#"
    id="file#intFileIndex#"
    />
     
    
    <br />
     
    
    </cfloop>
     
    
     
    
    <input type="submit" value="Upload Files" />
     
    
    </form>
    Last edited by acoder; May 22 '09, 10:51 AM. Reason: Added [code] tags
  • MoroccoIT
    New Member
    • May 2009
    • 9

    #2
    Multiple files upload while updating DB

    Greetings -

    ATTN Bytes Admin: My apologies, I am new to your Forum, I posted this thread on other place by accident, I tried to delete it but I couldn't, please delete the other one when you have a chance. Thank you.

    Back to my thread:
    I saw this code (pls see link below or code is pasted blow as well) that does mupltiple files upload. It works fine, but I wanted to populate the database with the same files that are uploaded to mydirectory, but for some reason, I am getting different file names on the database.

    exp: when I ploaded this files: photo1 photo2 photo3 photo4, I see all of them with right files names photo1.jpg photo2.jpg photo3.jpg photo4.jpg on the upload folder, but they get renamed on the database to: file1 file2 file3 file4. I'd like to see the same file names on the database as well.

    Below is the full code: Please do serach on kewword "database" to see where I added my database code - that's where I need help with - everything else is working fine.

    And here the link where I got it from:


    Thank you so much for any input you can provide

    @Karim
    MoroccoUSA.com


    Code:
    <!---
    Set the number of files that can uploaded in a single
    form submission.
    --->
    <cfset REQUEST.FileCount = 5 />
    
    
    <!--- Set the destination folder for uploads. --->
    <cfset REQUEST.UploadPath = ExpandPath( "./uploads/" ) />
    
    
    <!--- Param the appropriate number of file fields. --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
    
    
    <!--- Param file value. --->
    <cfparam
    name="FORM.file#intFileIndex#"
    type="string"
    default=""
    />
    
    
    </cfloop>
    
    
    
    
    <!--- Param upload flag. --->
    <cftry>
    <cfparam
    name="FORM.submitted"
    type="numeric"
    default="0"
    />
    
    
    <cfcatch>
    <cfset FORM.submitted = 0 />
    </cfcatch>
    </cftry>
    
    
    
    
    <!--- Set up an array to hold errors. --->
    <cfset arrErrors = ArrayNew( 1 ) />
    
    
    
    
    <!--- Check to see if the form has been submitted. --->
    <cfif FORM.submitted>
    
    
    <!---
    Here is where we would validate the data; however,
    in this example, there really isn't anything to
    validate. In order to validate something, we are going
    to require at least one file to be uploaded!
    --->
    
    
    
    
    <!---
    Since we are going to require at least one file, I am
    going to start off with an error statement. Then, I am
    gonna let the form tell me to DELETE IT.
    --->
    <cfset ArrayAppend(
    arrErrors,
    "Please select at least one file to upload"
    ) />
    
    
    
    
    <!--- Loop over the files looking for a valid one. --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
    
    
    <cfif Len( FORM[ "file#intFileIndex#" ] )>
    
    
    <!--- Clear the errors array. --->
    <cfset ArrayClear( arrErrors ) />
    
    
    <!--- Break out of loop. --->
    <cfbreak />
    
    
    </cfif>
    
    
    </cfloop>
    
    
    
    
    <!---
    Check to see if there were any form validation
    errors. If there are no errors, then we can continue
    to process the form. Otherwise, we are going to skip
    this and just let the page render again.
    --->
    <cfif NOT ArrayLen( arrErrors )>
    
    
    <!---
    Create an array to hold the list of uploaded
    files.
    --->
    <cfset arrUploaded = ArrayNew( 1 ) />
    
    
    
    
    <!---
    Loop over the form fields and upload the files
    that are valid (have a length).
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
    
    
    <!--- Check to see if file has a length. --->
    <cfif Len( FORM[ "file#intFileIndex#" ] )>
    
    
    <!---
    When uploading, remember to use a CFTry /
    CFCatch as complications might be encountered.
    --->
    <cftry>
    <cffile
    action="upload"
    destination="#REQUEST.UploadPath#"
    filefield="file#intFileIndex#"
    nameconflict="makeunique"
    />
    
    
    <!---
    Store this file name in the uploaded file
    array so we can reference it later.
    --->
    <cfset ArrayAppend(
    arrUploaded,
    (CFFILE.ServerDirectory & "\" & CFFILE.ServerFile)
    ) />
    
    [B]<!--- Store file names in the database --->
    <CFQUERY NAME="CreateDocumentRecord" DATASOURCE="mydb">
    INSERT INTO Uploads (user_ID, File_Name, Date_Published)
    VALUES (#Form.ClientID#, 'file#intFileIndex#', #Now()#)
    </CFQUERY>[/B]
    
    
    
    <!--- #FILE.ClientFile# #intFileIndex# File_Name, #intFileIndex#--->
    
    
    <!--- Catch upload errors. --->
    <cfcatch>
    
    
    <!--- Store the error. --->
    <cfset ArrayAppend(
    arrErrors,
    "There was a problem uploading file ###intFileIndex#: #CFCATCH.Message#"
    ) />
    
    
    <!---
    Break out of the upload loop as we
    don't want to deal with any more
    files than we have to.
    --->
    <cfbreak />
    
    
    </cfcatch>
    </cftry>
    
    
    </cfif>
    
    
    </cfloop>
    
    
    
    
    <!--- Check to see if we have any form errors. --->
    <cfif ArrayLen( arrErrors )>
    
    
    
    
    <!---
    We encountered an error somewhere in the upload
    process. As such, we want to clean up the server
    a bit by deleteing any files that were
    successfully uploaded as part of this process.
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#ArrayLen( arrUploaded )#"
    step="1">
    
    
    <!--- Try to delete this file. --->
    <cftry>
    <cffile
    action="delete"
    file="#arrUploaded[ intFileIndex ]#"
    />
    
    
    <cfcatch>
    <!--- File could not be deleted. --->
    </cfcatch>
    </cftry>
    
    
    </cfloop>
    
    
    
    
    <cfelse>
    
    
    
    
    <!---
    !! SUCCESS !!
    The files were properly uploaded and processed.
    Here is where you might forward someone to some
    sort of success / confirmation page.
    --->
    
    
    
    
    </cfif>
    
    
    </cfif>
    
    
    </cfif>
    
    
    
    
    <!--- Set the content type and reset the output buffer. --->
    <cfcontent
    type="text/html"
    reset="true"
    />
    
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
    <title>Multiple File Uploads</title>
    </head>
    <body>
    
    
    <cfoutput>
    
    
    <h1>
    Multiple File Upload ColdFusion Example
    </h1>
    
    
    
    
    <!--- Check to see if we have any errors to display. --->
    <cfif ArrayLen( arrErrors )>
    
    
    <p>
    Please review the following errors:
    </p>
    
    
    <ul>
    <cfloop
    index="intError"
    from="1"
    to="#ArrayLen( arrErrors )#"
    step="1">
    
    
    <li>
    #arrErrors[ intError ]#
    </li>
    
    
    </cfloop>
    </ul>
    
    
    </cfif>
    
    
    
    
    <form
    action="#CGI.script_name#"
    method="post"
    enctype="multipart/form-data">
    
    
    <!--- Submission flag. --->
    <input type="hidden" name="ClientID" value="163">
    <input type="hidden" name="submitted" value="1" />
    
    
    
    
    <!---
    Loop over the number of files we are going to
    allow for the upload.
    --->
    <cfloop
    index="intFileIndex"
    from="1"
    to="#REQUEST.FileCount#"
    step="1">
    
    
    <label for="file#intFileIndex#">
    File #intFileIndex#:
    </label>
    
    
    <input
    type="file"
    name="file#intFileIndex#"
    id="file#intFileIndex#"
    />
    
    
    <br />
    
    
    </cfloop>
    
    
    
    
    <input type="submit" value="Upload Files" />
    
    
    </form>

    Comment

    • acoder
      Recognized Expert MVP
      • Nov 2006
      • 16032

      #3
      Use CFFILE.ServerFi le instead of file#intFileInd ex# because file#intFileInd ex# is the name of the file field in the form, not the uploaded file name.

      Comment

      • MoroccoIT
        New Member
        • May 2009
        • 9

        #4
        Thank you so much acoder, it worked.

        However, I am still struggling to limit the number of files to be uploaded. As you can see, at the begening of the code I pasted, you should see:

        Code:
        <cfset REQUEST.FileCount = 5 />
        But this only displays 5 Forms from which a user can select the 5 files to upload. Once these 5 files are uploaded, he/she can keep uploading more files.

        Instead, I'd like to see a message stating "you already uploaded 5 files, sorry that was your limit"

        I am also working to limit the filesize, let say only 1MB file is allowed.

        But, If I can get help on having a user to upload up to 5 files, I would really appreciate that.

        Thanks again, you have been very helpful.

        @Karim
        MoroccoUSA.com

        Comment

        • acoder
          Recognized Expert MVP
          • Nov 2006
          • 16032

          #5
          Use session variables to keep track of the number of uploads by a user. For file size, use cffile.fileSize .

          Comment

          Working...