Search code examples
perlmojolicious

How to upload multiple files using Mojolicious?


I'm new to Mojolicious, trying to learn it. I'm trying to upload multiple files using form but only one file is uploaded at a time. Any suggestion?

#!perl -w

use Mojolicious::Lite;
use Mojo::Upload;
use v5.14;

get '/' => 'page';
post '/' => sub {
   my $self = shift;
   my @files;
   for my $file ($self->req->upload('files')) {
     my $size = $file->size;
     my $name = $file->filename;

     push @files, "$name ($size)";
     $file->move_to("C:\\Program Files\\Apache Software Foundation\\Apache24\\htdocs\\ProcessingFolder\\".$name);
   }
   $self->render(text => "@files");
} => 'save';

app->start;

__DATA__

@@ page.html.ep
<!DOCTYPE html>
<html>
   <body>
   <form action="<%=/ProcessingFolder/%>" method="POST"
enctype="multipart/form-data">
     <input name="files" type="file" enctype="multipart/form-data" multiple="multiple">
     <button type="submit">Upload</button>
   </form>
   </body>
</html>

Solution

  • Found Answer. Used uploads() instead of upload() which returns Array reference.

    #!perl -w
    
    use Mojolicious::Lite;
    use Mojo::Upload;
    use v5.14;
    
    get '/' => 'page';
    post '/' => sub {
       my $self = shift;
       my @files;
       for my $file (@{$self->req->uploads('files')}) {
         my $size = $file->size;
         my $name = $file->filename;
    
         push @files, "$name ($size)";
         $file->move_to("C:\\Program Files\\Apache Software Foundation\\Apache24\\htdocs\\ProcessingFolder\\".$name);
       }
       $self->render(text => "@files");
    } => 'save';
    
    app->start;
    
    __DATA__
    
    @@ page.html.ep
    <!DOCTYPE html>
    <html>
       <body>
       <form action="<%=/ProcessingFolder/%>" method="POST"
    enctype="multipart/form-data">
         <input name="files" type="file" enctype="multipart/form-data" multiple="multiple">
         <button type="submit">Upload</button>
       </form>
       </body>
    </html>