[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apache-modperl
Subject:    Multiple File Uploads: $r or %ARGS?
From:       Amiri Barksdale <amiribarksdale () gmail ! com>
Date:       2007-07-31 16:22:05
Message-ID: 184C47C6-A3E6-4391-9437-D95EC7132C34 () gmail ! com
[Download RAW message or body]

Hey folks. I'm new here, and this is my first post.

I'm trying to figure out a way to manage multiple file uploads. I  
have a form that allows users to upload arbitrary numbers of files,  
which I then need to process and save on the server. I have a  
javascript that allows this arbitrary number of files: by clicking a  
link, you create a new form field that adds a numeral to the end of  
the field name. The %ARGS hash looks like this for a single file:

file => 273141
title => Back to
id => 7
number => 1
creation_date => 2007

A multiple upload %ARGS looks like this:

file => 273141
title => Back to
id => 7
number => 1
creation_date => 2007

file-2 => that'shot8
title-2 => Natural
id-2 => 6
number-2 => 2
creation_date-2 => 1985

file-3 => Introduction
title-3 => Stuff Like This
id-3 => 12
number-3 => 3
creation_date-3 => 1998

I created a loop that allows me to handle the %ARGS data:

         my $i = 2;

         while ( $i <= $ARGS{'numberfiles'} ) {

             my %thash;


             foreach my $key ( sort( keys %ARGS ) ) {
                 if ( $key =~ /creation_date-$i/ ) {
                     $thash{'creation_date'} = $ARGS{$key};
                 }
                 if ( $key =~ /title-$i/ ) {
                 $thash{'title'} = $ARGS{$key};
                 }
                 if ( $key =~ /number-$i/ ) {
                     $thash{'number'} = $ARGS{$key};
                 }
                 if ( $key =~ /rate-$i/ ) {
                     $thash{'rate'} = $ARGS{$key};
                 }
                 if ( $key =~ /type-$i/ ) {
                 $thash{'type'} = $ARGS{$key};
                 }
                 if ( $key =~ /id-$i/ ) {
                     $thash{'id'} = $ARGS{$key};
                 }
                 if ( $key =~ /file-$i/ ) {
                 $thash{'file'} = $ARGS{$key};
                 }
             }

             my $nfile = $api->newBean('file');
        }
    $nfile->save($api);
    $i++;
}

But the problem is handling the actual files simultaneous with this  
file information. I have been trying to construct some sort of loop  
to go through each $r->upload->tempname object, but it seems like the  
only way to do that is to make it an entirely separate loop. Which  
gets kludgier and kludgier, because my object-oriented perl requires  
that I make a "mini hash" out of every file uploaded--the %thash  
above. I know there has to be an elegant way to do this: I just don't  
know it.

Is it possible to use the Apache::Request object instead of %ARGS  
altogether? Could I handle the file data and the files together using  
$r instead of taking the info from %ARGS here and trying to take the  
data from $r there?

Has anyone been faced with this problem before? All comments and  
help, insights and wisdom, would be greatly appreciated.

Amiri

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic