NAME

Apache2::ASP::MediaManager - Instant file management for Apache2::ASP applications

SYNOPSIS

Create a file in your /handlers folder named MM.pm and add the following:

package MM;

use strict;
use warnings 'all';
use base 'Apache2::ASP::MediaManager';
use vars __PACKAGE__->VARS;

sub before_download {
  my ($s, $context, $filename) = @_;
  
  warn "About to download '$filename'";
  return 1;
}

sub after_download {
  my ($s, $context, $filename) = @_;
  
  warn "Finished download of '$filename'";
  return 1;
}

sub before_create {
  my ($s, $context, $Upload) = @_;
  
  warn "About to create '$Upload->{filename_only}'";
  return 1;
}

sub after_create {
  my ($s, $context, $Upload) = @_;
  
  warn "Just created '$Upload->{filename_only}'";
  return $Response->Redirect( $ENV{HTTP_REFERER} );
}

sub before_update {
  my ($s, $context, $Upload) = @_;
  
  warn "About to update '$Upload->{filename_only}'";
  return 1;
}

sub after_update {
  my ($s, $context, $Upload) = @_;
  
  warn "Just updated '$Upload->{filename_only}'";
  return $Response->Redirect( $ENV{HTTP_REFERER} );
}

sub after_delete {
  my ($s, $context, $filename) = @_;
  
  warn "Just deleted '$filename'";
  return $Response->Redirect( $ENV{HTTP_REFERER} );
}

1;# return true:

Then create a file in your /htdocs folder named mm-test.asp:

<html>
  <body>
    <h1>File Upload Test</h1>
    <form
        method="post"
        enctype="multipart/form-data"
        action="/handlers/MM?mode=create&uploadID=2kj4hkj234h">
      <input type="file" name="filename" >
      <input type="submit" value="Upload File Now">
    </form>
    
    <h2>Existing Files (if any)</h2>
    <p>
<%
  opendir my $dir, $Config->web->media_manager_upload_root;
  while( my $file = readdir($dir) )
  {
    next unless -f $Config->web->media_manager_upload_root . '/' . $file;
%>
      <a href="/handlers/MM?file=<%= $file %>"><%= $file %></a><br>
<%
  }# end while()
%>
    </o>
  </body>
</html>

REALLY IMPORTANT!: Notice the ?mode=create&uploadID=2kj4hkj234h in the action attribute of the form tag. The mode tells the MediaManager that we are creating a file, and the uploadID will allow us to track the progress of the upload.

IMPORTANT: Check your configuration, where you see:

<config>
  ...
  <web>
    ...
    <media_manager_upload_root>@ServerRoot@/MEDIA</media_manager_upload_root>
    ...
  </web>
  ...
</config>

Make *sure* that your webserver has ownership or read/write access to that folder and all of its contents.

When you access http://yoursite.com/mm-test.asp in your browser and submit the form, Apache2::ASP::MediaManager will save it under your media_manager_upload_root folder for you.

DESCRIPTION

Handling file uploads can be a real pain. Restricting file uploads and downloads to a select group of users is also problematic.

And Then...

And then there was Apache2::ASP::MediaManager. Now you can have fully-functional file uploads in seconds.

UPLOAD PROGRESS INDICATORS

Apache2::ASP::MediaManager makes it easy to provide upload progress indicators.

Remember that uploadID parameter in the action attribute of your form? While the upload is taking place, the $Session object is getting updated with the status of the upload. If you were to make another handler - /handlers/UploadProgress.pm - and insert the following code:

package UploadProgress;

use strict;
use base 'Apache2::ASP::FormHandler';
use vars __PACKAGE__->VARS;

sub run {
  my ($s, $context) = @_;
  
  my $uploadID = $Form->{uploadID};
  
  $Session->{"upload$uploadID" . "percent_complete"} ||= 0;
  
  $Response->Expires( -30 );
  $Response->Write( $Session->{"upload$uploadID" . "percent_complete"} );
}# end run()

1;# return true:

And add call out to it via AJAX - you can get real-time upload progress information about the current upload.

Example:

window.setInterval(function() {
  httpOb.open("GET", "/handlers/UploadProgress?uploadID=2kj4hkj234h", true);
  httpOb.onreadystatechange = function() {
    if( httpOb.readyState == 4 ) {
      document.getElementById("percent_complete").innerHTML = httpOb.responseText + '%';
    }// end if()
  };
}, 1000);

You should also add an element with an id of "percent_complete" to he form:

<div id="percent_complete">0%</div>

PUBLIC PROPERTIES

None.

PUBLIC METHODS

Nothing you need to worry about.

EVENTS

About the $Upload argument:

The $Upload argument is an instance of Apache2::ASP::UploadHookArgs.

before_download( $self, $context )

Called before allowing a file to be downloaded from the server.

NOTE: This method must return true, or the file will not be downloaded.

after_download( $self, $context )

Called after allowing a file to be downloaded from the server.

before_create( $self, $context, $Upload )

Called before allowing a new file to be uploaded to the server.

NOTE: This method must return true, or the file will not be created.

after_create( $self, $context, $Upload )

Called after allowing a new file to be uploaded to the server.

before_update( $self, $context, $Upload )

Called before allowing a new file to be uploaded to replace an existing file.

NOTE: This method must return true, or the file will not be updated.

after_update( $self, $context, $Upload )

Called after a new file has been uploaded to replace an existing file.

before_delete( $self, $context, $filename )

Called before deleting a file.

NOTE: This method must return true, or the file will not be deleted.

after_delete( $self, $context, $filename )

Called after deleting a file.

BUGS

It's possible that some bugs have found their way into this release.

Use RT http://rt.cpan.org/NoAuth/Bugs.html?Dist=Apache2-ASP to submit bug reports.

HOMEPAGE

Please visit the Apache2::ASP homepage at http://www.devstack.com/ to see examples of Apache2::ASP in action.

AUTHOR

John Drago mailto:jdrago_999@yahoo.com

COPYRIGHT AND LICENSE

Copyright 2007 John Drago, All rights reserved.

This software is free software. It may be used and distributed under the same terms as Perl itself.