package HTTP::Engine::Request::Upload; use Any::Moose; has filename => ( is => 'ro', ); has headers => ( is => 'ro', handles => { type => 'content_type' }, ); has size => ( is => 'ro', ); has tempname => ( is => 'ro', ); has basename => ( is => 'ro', lazy => 1, default => sub { my $self = shift; require File::Spec::Unix; my $basename = $self->filename; $basename =~ s|\\|/|g; $basename = ( File::Spec::Unix->splitpath($basename) )[2]; $basename =~ s|[^\w\.-]+|_|g; $basename; } ); has fh => ( is => 'ro', lazy => 1, default => sub { my $self = shift; open my $fh, '<', $self->tempname or die "Can't open '@{[ $self->tempname ]}': '$!'"; return $fh; }, ); sub copy_to { my $self = shift; require File::Copy; File::Copy::copy( $self->tempname, @_ ); } sub link_to { my ( $self, $target ) = @_; CORE::link( $self->tempname, $target ); } sub slurp { my ( $self, $layer ) = @_; $layer = ':raw' unless $layer; my $content = undef; my $handle = $self->fh; binmode( $handle, $layer ); while ( $handle->read( my $buffer, 8192 ) ) { $content .= $buffer; } $content; } no Any::Moose; __PACKAGE__->meta->make_immutable(inline_destructor => 1); 1; __END__ =head1 NAME HTTP::Engine::Request::Upload - handles file upload requests =head1 METHODS =over 4 =item basename Returns basename for "filename". =item link_to Creates a hard link to the temporary file. Returns true for success, false for failure. $upload->link_to('/path/to/target'); =item slurp Returns a scalar containing the contents of the temporary file. =item copy_to Copies the temporary file using File::Copy. Returns true for success, false for failure. $upload->copy_to('/path/to/targe') =back =head1 AUTHORS Kazuhiro Osawa and HTTP::Engine authors. =head1 THANKS TO the authors of L. =head1 SEE ALSO L, L