www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Ergänzung

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
FreeBSD Logo