App-BlurFill
view release on metacpan or search on metacpan
lib/App/BlurFill/Web.pm view on Meta::CPAN
$outfile = $blur->process;
} or return status 500, { error => "Processing failed: $@" };
my ($out_name) = File::Basename::fileparse($outfile);
# Copy the processed file to our persistent temp directory
my $persistent_path = File::Spec->catfile($TEMP_DIR, $out_name);
File::Copy::copy($outfile, $persistent_path) or die "Copy failed: $!";
# Display results page with image preview and download link
my $css = _get_css();
return <<"HTML";
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BlurFill - Result</title>
<style>
$css
</style>
</head>
<body>
<div class="container">
<h1>BlurFill</h1>
<p class="subtitle">Your resized image is ready!</p>
<div class="success-message">
<strong>â Success!</strong> Your image has been processed successfully.
</div>
<div class="result-image">
<img src="/download/$out_name" alt="Resized image preview">
</div>
<div class="action-buttons">
<a href="/download/$out_name" class="button" download>Download image</a>
<a href="/" class="button button-secondary">Create another</a>
</div>
<div class="info">
<p><strong>What's next?</strong></p>
<p>⢠Click "Download image" to save your resized background</p>
<p>⢠Click "Create another" to process a new image</p>
</div>
</div>
</body>
</html>
HTML
};
get '/download/:filename' => sub {
my $filename = route_parameters->get('filename');
# Security: only allow filenames without path traversal
return status 400, { error => 'Invalid filename' }
if $filename =~ m{[/\\]};
my $filepath = File::Spec->catfile($TEMP_DIR, $filename);
return status 404, { error => 'File not found' }
unless -f $filepath;
# Determine content type from extension
my $ext = lc($filename);
$ext =~ s/.*\.//;
my %mime = (
jpg => 'image/jpeg',
jpeg => 'image/jpeg',
png => 'image/png',
gif => 'image/gif',
);
my $content_type = $mime{$ext} || 'application/octet-stream';
send_file(
$filepath,
system_path => 1,
content_type => $content_type,
);
};
=head1 AUTHOR
Dave Cross <dave@perlhacks.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2025, Magnum Solutions Ltd. All rights reserved.
This is free software; you can redistribute it and/or modify it under the
same terms as the Perl 5 programming language system itself.
=cut
( run in 3.100 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )