xeronuro
11/16/2012 - 1:09 AM

mojolicious_auth_upload.pl

#!/usr/bin/env perl
use Mojolicious::Lite;

my $use_auth = 1;    # with auth enabled..
my ( $user, $pass ) = qw/user password/;
if ($use_auth) { plugin 'basic_auth'; }

get '/' => sub { my $self = shift; $self->redirect_to('/upload'); };
get '/upload' => sub {
  my $self = shift;
  # give "upload_message" as flash if it was in the session
  if ( my $flash = $self->session('upload_message') ) {
    $self->flash( 'upload_message' => $flash );
    $self->session('upload_message' => ''); # and remove it from the session...
  }
  return if ( $use_auth && !$self->helper( basic_auth => realm => $user => $pass ) );
  $self->render('upload_form');
};

post '/upload' => sub {
  my $self = shift;
  return if ( $use_auth && !$self->helper( basic_auth => realm => $user => $pass ) );

  if ( my $u = $self->req->upload('file') ) {

    # pretend the file is uploaded and put somewhere
    # rather than ->flash, use ->session as the flash is eaten by the 401 redirect
    $self->session( upload_message => "Uploaded " . $u->filename . " (size: " . $u->size . ")", );
  }
  $self->redirect_to('/upload');
};

app->start;
__DATA__

@@ upload_form.html.ep
% layout 'html5';
Upload a file:
<form action="/upload" enctype="multipart/form-data" method="post">
    <label for="file">File to upload:</label>
    <input type="file" name="file"><br />
    <input type="submit" value="Upload it!">
</form>
<% if ( my $message = flash 'upload_message' ) { %>
  <pre>Flash: <%= $message =></pre>
<% } %>

@@ layouts/html5.html.ep
<!doctype html><html>
    <head><title>Upload issue</title></head>
    <body><%== content %></body>
</html>