Just to make this code complete with working example. Did not know this, but Mojolicious has no dependencies, and also CGI is out of Perl core.
#!/usr/bin/env perl
use strict;
use warnings;
use Mojolicious::Lite;
my $uploadFileDirectory = 'UPLOADS';
mkdir $uploadFileDirectory if ( !-d $uploadFileDirectory );
$ENV{"MOJO_MAX_MESSAGE_SIZE"} = 25 * 2**20; #25 MB
get '/upload' => sub {
my $c = shift;
$c->render('simpleUploadForm');
};
post '/handleUpload' => sub {
my $c = shift;
my @fileNames;
my $files = $c->req->every_upload('files');
for my $file ( @{$files} ) {
my $fileName = $file->filename =~ s/[^\w\d\.]+/_/gr;
$file->move_to("$uploadFileDirectory/$fileName");
$c->app->log->debug("$fileName uploaded\n");
push @fileNames, $fileName;
}
$c->render( 'successUpload', files => \@fileNames );
};
app->start;
__DATA__
@@ simpleUploadForm.html.ep
<!DOCTYPE html>
<html>
<form action='/handleUpload' method='post' enctype='multipart/form-
+data'>
Select Files: <input type='file' name='files' multiple=1><br/>
<input type="submit" >
</html>
@@ successUpload.html.ep
<!DOCTYPE html>
<html>
<img src='success.jpg' />
<% for my $j (@{$files}) { %>
<p>
<%= $j %>
</p>
<% } %>
</html>
@@ exception.development.html.ep
<!DOCTYPE html>
<html>
Fail
</html>
Update: Must use method "every_upload" introduced in Mojolicious 5.48 or you will only get one file.