В mojolicious, как защитить изображения от публичного просмотра

Кто-нибудь может мне помочь, пожалуйста. У меня есть приложение в mojolicious Lite

Я хочу заблокировать изображения для всех без входа в сессию

когда я http://m.y.i.p:3000/images/imageX.jpg

Я хочу показывать изображения только при входе в сессию.

мой HTML-код

<a href="images/imagex.jpg">shwo image 1 </a>

2 ответа

Решение

Так же, как и любой другой контент. Установите обработчик для запросов, визуализируйте (или не визуализируйте) контент.

get '/images/*img' => sub {
    my $c = shift;
    if (!$c->session("is_authenticated")) {
        return $c->render( text => "Forbidden", status => 403 );
    }
    my $file = $c->param("img");
    if (!open(my $fh, '<', $IMAGE_DIR/$file)) {
        return $c->render( text => "Not found", status => 404 );
    }
    my $data = do { local $/; <$fh> };
    close $fh;
    $c->render( data => $data, format => 'jpg' );
};

Ваш обработчик запросов будет иметь приоритет над обработчиком по умолчанию, который обслуживает содержимое из общих папок, но как только у вас есть этот обработчик, вам не нужно хранить файлы, которые он обслуживает, в общей папке.

Другое решение

get '/pays/*img' => sub {
my $self = shift;

my $img = $self->param('img');
plugin 'RenderFile';

my @imgext = split(/\./, $img);
my $ext = $imgext[-1];


$self->render_file(
'filepath' => "/directiry/$img",
'format'   => "$ext",                 # will change Content-Type "application/x-download" to "application/pdf"
'content_disposition' => 'inline',   # will change Content-Disposition from "attachment" to "inline"
                     # delete file after completed

);

Это использовать плагин 'RenderFile';

Другие вопросы по тегам