dcsimg


DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Results 1 to 3 of 3

Thread: CGI/perl to upload file from AJAX

  1. #1
    Join Date
    Feb 2009
    Posts
    2

    CGI/perl to upload file from AJAX

    Hi all,
    I have a problem using the upload method from CGI when the information is sent from ajax. (see code below)
    I am getting an undefined filehandle
    Perl error message:
    Use of uninitialized value in <HANDLE>
    I don't have problems retrieving the parameters from the ajax and creating the folder and the file (an empty one)(so permissions are ok).
    The problem is I cannot read from the filehandle.

    So, if I add contentType in ajax:
    Code:
    contentType: "multipart/form-data",
    I am not getting into the CGI and I am getting this error from the server:
    Malformed multipart POST: data truncated
    Any suggestions how to solve this.
    Thanks for your time and help!

    html form

    HTML Code:
    <link rel="stylesheet" href="jquery.jgrowl.css" type="text/css"/>
    
    <!-- jQuery Library -->
    <script type="text/javascript" language="javascript" src="jquery-1.2.6.js"></script>
    <script type="text/javascript" language="javascript" src="jquery.jgrowl.js"></script>
    
    <script type="text/javascript" language="javascript" src="test_ajax.js"></script>
    
    <input type=file id=test>
    
    <div id=output></div>
    AJAX

    Code:
    $(document).ready(function () {
        $("#test").change(function(){
          alert($(this).val());
          var info = $.trim($(this).val());
            $.ajax({
              type: "POST",
              url: "/cgi-bin/upload_and_check.cgi",
              data: "filename="+info+"&session_id=abc",
              success: function(msg){             		 
                alert("This is the message: " + msg);
                $("#output").html(msg);
                $.jGrowl(msg, { sticky: true });
              }
           });
        }); 	
    });
    CGI/perl

    Code:
    #!/usr/bin/perl
    
    use warnings;
    use strict;
    use CGI;
    
    my $form = new CGI;
    print $form->header; #Print HTML header
    
    my $web_home = "$ENV{DOCUMENT_ROOT}/ajax";
    
    #Getting parametres from form
    my $session_id = $form->param("session_id"); 
    my $filename = $form->param("filename");
    
    #Create temp dir if doesn't exist yet
    umask 0000;  
    if ( !-e "$web_home/tmp/$session_id" ) {
        mkdir "$web_home/tmp/$session_id", 0777 
             or die "Problems creating temporary dir '$web_home/tmp/$session_id':  $!\n";
    }
    
    #the upload() method to grab the file handle
    my $UPLOAD_FH = $form->upload("filename");
    
    my $newfilename = $session_id;
    
    open my $NEWFILE_FH, "+>", "$web_home/tmp/$session_id/$newfilename.txt" 
        or die "Problems creating file '$newfilename': $!";
     
    while ( <$UPLOAD_FH> ) {
    	print $NEWFILE_FH;
    }
    
    close $NEWFILE_FH or die "I cannot close filehandle: $!";
    
    exit;

  2. #2
    Join Date
    Feb 2009
    Posts
    2
    Finilly, I found a solution. Here, I am posting a really simple example using ajax and cgi/perl (server site) to upload files. No reload and no submit button.
    I hope it helps for others as example.

    HTML
    Code:
    <!--jquery should be included before any other js-->
    <script type="text/javascript" language="javascript" src="/simple_ajax_cgi_example/jquery-1.2.6.js"></script>
    <script type="text/javascript" language="javascript" src="/simple_ajax_cgi_example/simple_ajax_cgi_example.js"></script>
    
    <html>
    <body>
    <form action="/cgi-bin/simple_ajax_cgi_example.cgi" id="form1" name="form1" encType="multipart/form-data"  method="post" target="hidden_frame" >
    <input type="file" id="file" name="file" style="width:450">
    <!--<INPUT type="submit"  id="test" value="submit">-->
    <span id="msg"></span>
    <br>
           
    <iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
    </form>
    
    </body>
    </html>
    AJAX simple_ajax_cgi_example.js
    Code:
    $(document).ready(function () {
        $("#file").change(function() {
            $("#form1").submit();
        });
    });
    
    function callback(msg) {
        $("#msg").html(msg);
    }
    CGI/Perl simple_ajax_cgi_example.cgi
    Code:
    #!/usr/bin/perl
    
    use warnings;
    use strict;
    use CGI;
    
    my $form = new CGI;
    
    print $form->header; #Print HTML header. this is mandatory
    
    my $web_home = "$ENV{DOCUMENT_ROOT}/simple_ajax_cgi_example";
    
    my $UPLOAD_FH = $form->upload("file");
    
    my $newfilename = "new_file";
    
    umask 0000; #This is needed to ensure permission in new file
    
    open my $NEWFILE_FH, "+>", "$web_home/tmp/$newfilename.txt" 
        or die "Problems creating file '$newfilename': $!";
    
    while ( <$UPLOAD_FH> ) {
        print $NEWFILE_FH "$_";
    }
    
    close $NEWFILE_FH or die "I cannot close filehandle: $!";
    
    ##this is the only way to send msg back to the client
    print "<script>parent.callback('upload file success')</script>";
    
    exit;
    Last edited by flope004; 02-05-2009 at 06:36 PM.

  3. #3
    Join Date
    Apr 2007
    Location
    Sterling Heights, Michigan
    Posts
    8,663
    Thanks for coming back and posting your solution.

    Hopefully it will help others.

Similar Threads

  1. Replies: 0
    Last Post: 09-25-2006, 11:46 AM
  2. Replies: 0
    Last Post: 11-10-2005, 11:07 PM
  3. File upload help
    By Chris in forum ASP.NET
    Replies: 5
    Last Post: 09-01-2002, 07:46 AM
  4. How long before the next version??
    By _CAG in forum .NET
    Replies: 146
    Last Post: 08-12-2002, 10:40 PM
  5. NullPointerException when reading text file
    By Andrew McLellan in forum Java
    Replies: 3
    Last Post: 05-09-2001, 05:34 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


   Development Centers

   -- Android Development Center
   -- Cloud Development Project Center
   -- HTML5 Development Center
   -- Windows Mobile Development Center