NAME
Uniform::Upload - Framework-agnostic upload manager and base driver engine
SYNOPSIS
use Uniform::Upload;
# Standalone manager setup
my $upload = Uniform::Upload->new(
max_size => '5MB',
allowed_types => [qw( image/png image/jpeg application/pdf )],
);
# Wrap raw upload payload hashes into validated objects
my $file = $upload->wrap(
name => 'avatar',
filename => 'user_photo.png',
tmp_path => '/tmp/cpan_upload_12345',
size => 2048576,
type => 'image/png',
);
if ($file->is_valid) {
$file->copy_to('/var/uploads/' . $file->sanitized_filename);
} else {
die "Upload failed validation: " . $file->error;
}
DESCRIPTION
Uniform::Upload provides a unified interface for inspecting, validating, and managing uploaded files across web applications. It acts as both a standalone file upload factory and an abstract base engine for framework-specific extension drivers (such as Uniform::Upload::PAGI or Uniform::Upload::Plack).
METHODS
new
my $upload = Uniform::Upload->new(%options);
Constructs a new manager object. Supported options:
max_sizeMaximum file size cap. Accepts raw byte integers or human-readable strings like
'2MB'or'500KB'(parsed via Uniform::Utils).allowed_typesArray reference of allowed MIME type strings (e.g.,
['image/png', 'image/jpeg']).file_classPackage name used to wrap file payloads. Defaults to Uniform::Upload::File.
wrap
my $file = $upload->wrap(%file_args);
Instantiates and returns a new Uniform::Upload::File (or custom file_class) instance initialized with the manager's global validation parameters.
extract
my $files = $upload->extract;
Abstract factory method intended to be overridden by subclass drivers to parse incoming framework request payloads. Croaks if invoked directly on Uniform::Upload.
max_size
Returns the parsed byte cap for uploads, or undef if unrestricted.
allowed_types
Returns the array reference of configured MIME type string constraints.
file_class
Returns the target file wrapper class package name.
INHERITANCE AND SUBCLASSING
Subclass drivers extend Uniform::Upload using object-oriented inheritance via parent and constructor delegation with SUPER::new:
package Uniform::Upload::MyFramework;
use strict;
use warnings;
use parent 'Uniform::Upload';
use Scalar::Util qw(blessed);
use Carp qw(croak);
sub new {
my ($class, $req, %args) = @_;
croak "Requires request object" unless blessed($req);
return $class->SUPER::new(
in => $req,
%args,
);
}
sub extract {
my ($self) = @_;
my $req = $self->{in};
my @files;
for my $raw ($req->uploads) {
push @files, $self->wrap(%$raw);
}
return \@files;
}
1;
SEE ALSO
AUTHOR
Joshua S. Day <HAX@cpan.org>
LICENSE AND COPYRIGHT
This software is Copyright (c) 2026 by Joshua S. Day[cite: 9].
This is free software, licensed under:
The MIT (X11) License