Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
PutHandler.pm
# Apache/PutHandler.pm -- Ein einfacher PUT-Handler mit mod_perl.
package Apache::PutHandler;
use strict;
use Apache::Constants qw(:common);
use Apache::File qw();
use constant MYLOCATION => '/tmp/';
# handler() ist der Eintrittspunkt, der von mod_perl bei Bedarf
# aufgerufen wird.
sub handler {
my $r = shift; # Unser Anforderungsobjekt
my $meth = $r->method(); # Welche HTTP-Methode?
return handle_put($r) if $meth eq 'PUT'; # Bei 'PUT' hierhim!
return handle_get($r) if $meth eq 'GET'; # Bei 'GET' dorthin!
return DECLINED; # Weder 'GET' noch 'PUT', kuemmert uns nicht!
}
# Dieser Handler ist fuer das Handling der PUT-Anforderung zustaendig:
sub handle_put {
my $r = shift; # Das mod_perl Anforderungsobjekt
my $uri = $r->uri(); # Die PUT-URL
$r->warn("Requested URI: $uri"); # Ab ins Apache-Logfile!
# Wir lesen nun den Inhalt der uploadeten Datei.
# Es sind 'Content-length: '-Bytes zu lesen.
my $buff; # Hier soll der Inhalt der Datei landen.
$r->read($buff, $r->header_in('Content-length'));
# Wir transformieren die URL so, dass alle Dateien
# unter MYLOCATION (/tmp) landen.
# Wir haetten hier z.B. auch die Dateien in DBI-Datenbanken,
# Tar-Files, oder anderen obskuren Stellen speichern koennen.
# Hier einfach: /a/path/to/afile.html -> /tmp/afile.html.
my $fname = $uri; $fname =~ s,.*/,,; $fname = MYLOCATION . $fname;
$r->warn("Output File: $fname"); # Debugging-Info.
# Wir entscheiden uns hier fuer die Speicherung der uploadeten
# Datei in eine lokale Datei mit Pfadnamen $fname:
unless (open(OUTFILE, "> $fname")) {
# Das war wohl nichts: Fehlermeldung zum Webclient senden:
$r->print("Content-type: text/plain\n\n");
$r->print("Can't open $fname: $!\n");
return OK; # Wir sind mit dieser Anforderung fertig.
}
print OUTFILE $buff; # Alles speichern.
close(OUTFILE);
# Alles ist okay, die Datei wurde angenommen.
$r->send_http_header(); # Die Bestaetigung senden
$r->print(); # Eine leere-Zeile bzw. eine Meldung.
return OK; # Okay, alles in Ordnung.
}
# Dieser Handler kuemmert sich um gewoehnliche GET-Aufrufe:
sub handle_get {
my $r = shift; # Das mod_perl Anforderungsobjekt
my $uri = $r->uri(); # Die geforderte URL.
# URL-Transformation: /a/path/to/afile.html -> /tmp/afile.html
# da alle unsere uploadeten Dateien im Shadow-Verzeichnis /tmp sind.
# Hier haetten wir wieder eine andere Strategie verfolgen koennen,
# z.B. eine DBI-Datenbank, ein externes Programm aufrufen etc.
my $fname = $uri; $fname =~ s,.*/,,; $fname = MYLOCATION . $fname;
# Die echte Datei (z.B.) /tmp/afile.html zum Lesen oeffnen:
my $fh = Apache::File->new($fname) || return DECLINED;
# Okay, senden wir die HTTP-Header und die geforderte Datei
# zum Webclient.
$r->send_http_header();
$r->send_fd($fh);
return OK; # Alles fertig.
}
1; # Ende des Moduls
[Prev] [Up] [Relevant Chapter] [Next]
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:55:46 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|