Apache2-ASP
view release on metacpan or search on metacpan
lib/Apache2/ASP/MediaManager.pm view on Meta::CPAN
package Apache2::ASP::MediaManager;
use strict;
use base 'Apache2::ASP::UploadHandler';
use MIME::Types;
use IO::File;
my $mimetypes = MIME::Types->new();
#==============================================================================
sub run
{
my ($s, $context) = @_;
shift(@_);
my $mode = $context->request->Form->{mode};
return unless ( ! $mode ) || ( $mode !~ m/^(create|edit)$/ );
my $filename = $s->compose_download_file_path( $context );
my $file = $s->compose_download_file_name( $context );
# Find its MIME type and set our 'ContentType' value:
my $ext;
unless( $mode )
{
# Find its MIME type and set our 'ContentType' value:
($ext) = $file =~ m/.*?\.([^\.]+)$/;
my $type = $ext ? $mimetypes->mimeTypeOf( $ext ) || 'application/octet-stream' : 'application/octet-stream';
$context->response->ContentType( $type );
}# end unless()
# Call our extension hooks:
if( $mode )
{
if( $mode eq 'delete' )
{
$s->before_delete( $context, $filename )
or return;
$s->delete_file( $context, $filename );
return $s->after_delete( $context, $filename );
}
elsif( defined(my $handler = $s->modes( $mode )) )
{
return $handler->( $s, $context );
}# end if()
}# end if()
# Get the readable filehandle:
unless( -f $filename )
{
$context->response->Status( 404 );
return;
}# end unless()
# Call our before- hook:
$s->before_download( $context, $filename )
or return;
# Wait until "before_download" has cleared before we open a filehandle:
my $ifh = $s->open_file_for_reading( $context, $filename );
# Send any HTTP headers:
$s->send_http_headers($context, $filename, $file, $ext);
# Print the file out:
if( (stat($ifh))[7] < 1024 ** 2 )
{
# File is < 1M, so just slurp and print:
local $/;
$context->response->Write( scalar(<$ifh>) );
}
else
{
while( my $line = <$ifh> )
{
$context->response->Write( $line );
}# end while()
lib/Apache2/ASP/MediaManager.pm view on Meta::CPAN
#==============================================================================
sub compose_upload_file_name
{
my ($s, $context, $Upload) = @_;
# my $filename = $Upload;
my ($filename) = $Upload->{upload}->{upload_filename} =~ m/.*[\\\/]([^\/\\]+)$/;
if( ! $filename )
{
$filename = $Upload->{upload}->{upload_filename};
}# end if()
return $filename;
}# end compose_upload_file_name()
#==============================================================================
sub compose_upload_file_path
{
my ($s, $context, $Upload, $filename) = @_;
unless( defined($filename) && length($filename) )
{
die "\$filename not provided";
}# end unless()
return $context->config->web->media_manager_upload_root . "/$filename";
}# end compose_upload_file_path()
#==============================================================================
sub upload_start
{
my ($s, $context, $Upload) = @_;
shift(@_);
$s->SUPER::upload_start( $context, $Upload );
my $filename = $s->compose_upload_file_name( @_ );
# Make sure we can open the file for writing:
my $target_file = $s->compose_upload_file_path( $context, $Upload, $filename);
# Open the file for writing:
my $ofh = $s->open_file_for_writing($context, $target_file);
print $ofh delete($Upload->{data});
# Done with the filehandle:
$ofh->close;
# Store some information for later:
$ENV{filename} ||= $target_file;
$ENV{download_file} ||= $filename;
# Depending on the 'mode' parameter, we do different things:
local $_ = $s->_args('mode');
if( /^create$/ )
{
$s->before_create($context, $Upload);
}
elsif( /^edit$/ )
{
$s->before_update($context, $Upload);
}
else
{
die "Unknown mode: '$_'";
}# end if()
}# end upload_start()
#==============================================================================
sub upload_hook
{
my ($s, $context, $Upload) = @_;
shift(@_);
$s->SUPER::upload_hook( @_ );
my $filename = eval {
my $name = $ENV{filename}; # $context->r->pnotes( 'filename' );
$name;
} or return;
my $ofh = $s->open_file_for_appending($context, $filename);
no warnings 'uninitialized';
print $ofh delete($Upload->{data});
$ofh->close;
}# end upload_hook()
#==============================================================================
sub upload_end
{
my ($s, $context, $Upload) = @_;
shift(@_);
$s->SUPER::upload_end( @_ );
# Return information about what we just did:
my $info = {
new_file => $ENV{filename},
filename_only => $ENV{download_file},
link_to_file => "/media/" . $ENV{download_file},
};
$Upload->{$_} = $info->{$_} foreach keys(%$info);
# Depending on the 'mode' parameter, we do different things:
# local $_ = $context->request->Form->{mode};
my $form = $context->request->Form;
$form = $context->request->Form;
if( $form->{mode} =~ /^create$/ )
{
$s->after_create($context, $Upload);
}
elsif( $form->{mode} =~ /^edit$/ )
{
$s->after_update($context, $Upload);
}
else
{
die "Unknown mode: '$_'";
}# end if()
}# end upload_end()
#==============================================================================
sub before_download
{
my ($s, $context) = @_;
}# end before_download()
#==============================================================================
sub after_download
{
my ($s, $context) = @_;
}# end after_download()
#==============================================================================
sub before_create
{
my ($s, $context, $Upload) = @_;
1;
}# end before_create()
#==============================================================================
sub before_update
{
my ($s, $context, $Upload) = @_;
1;
}# end before_update()
#==============================================================================
sub after_create
{
my ($s, $context, $Upload) = @_;
}# end after_create()
#==============================================================================
sub after_update
{
my ($s, $context, $Upload) = @_;
}# end after_update()
#==============================================================================
sub before_delete
( run in 2.839 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )