Markus Dopp: Dateien an Browser senden

Hi,

wie kann man dateien z.B. direkt aus dem cgi-bin verzeichnis auf dem web server an den Browser des Benutzers senden? So soll der Benutzer die datei nur geschickt bekommen, falls er vorher sein richtiges passwort eingeben hat. Ein normaler Link ist also hier nicht gefragt, da man sonst ja auch ohne passworteingabe z.B. nur per Bookmark sich die datei beliebig herunterladen kann.

Muss man anstatt
   print "Content-type: text/html\n\n";

print "Content-type: application/octet-stream\n\n";
schreiben??

Wie sende ich dann die datei an den browser, damit der benutzer sie lokal speichern kann??

Mit Dank im Vorraus,

Markus

  1. Hi,
    eine Möglichkeit, bei der allerdings der Link ebenfalls sichtbar wird währe:
    Das CGI prüft das Passwort und schreibt dann die folgenden 2 Zeilen:
    print "Content-type: text/html\n\n";
    print '<html><head><script language="javascript">document.location.href="[url]";</script></head></html>';
    Anstatt [url] dann einfach die URL der Datei einsetzen - eine andere Möglichkeit kenne ich leider nicht.
    Hope that will help U!
    CU
    AZ

  2. Hi,

    Muss man anstatt
       print "Content-type: text/html\n\n";

    print "Content-type: application/octet-stream\n\n";
    schreiben??

    Du mußt den Content-type ausgeben, der zum Dateityp paßt. Anschließend gibst Du die Datei mit open, print und close aus. Auf archaischen Systemen (Windows) mußt Du noch mit binmode arbeiten.

    Alternative (bei der es aber möglich ist, die URL herauszufinden) ist:

    use CGI qw(:standard);
    print redirect('http://domain.de/path/to/your/file.ext');

    Cheatah

  3. Hi, Markus!

    Schreibe einfach eine HTML-Seite mit 'nem Formular, in das der User sein Passwort eintragen muß. In einem CGI-Script fragst Du das PW ab und bei richtigem sendest Du die Datei. Als content type gibst Du was an, was kein Browser kennt, dann bietet der Browser von sich aus einen Dialog an, in dem er von User wissen will,was mit der Datei geschehen soll, z.B. speichern. Gültige Content-Types findest Du hier: <../../tcjj.htm>.
    Ist allerdings bzgl. des Passwortes recht unsicher. Da gibts in diversen Perl-Script-Sammlungen bessere Lösungen http://www.teamone.de/selfaktuell/links/cgi_perl_sammlungen.htm.

    Gruß Frank

  4. wie kann man dateien z.B. direkt aus dem cgi-bin verzeichnis auf dem web server an den Browser des Benutzers senden?

    Ich halte es nicht für sinnvoll, eine solche Datei im CGI-Verzeichnis abzulegen. Dort gehören CGI-Anwendungen hin und sonst nichts.
    Die Datei sollte ganz woanders liegen - das CGI-Skript spricht sie ja ohnehin via Pfadname an.

    So soll der Benutzer die datei nur geschickt bekommen, falls er vorher sein richtiges passwort eingeben hat.
    Ein normaler Link ist also hier nicht gefragt, da man sonst ja auch ohne passworteingabe z.B. nur per Bookmark sich die datei beliebig herunterladen kann.

    Das ist nicht wahr. Schon mal was von http://www.teamone.de/selfaktuell/artikel/schroepl01.htm gehört?
    Eigentlich brauchst Du überhaupt keine CGI-Anwendung - nur einen vernünftigen Schutzmechanismus. Und der ist in den meisten Webservern eingebaut.

    Muss man anstatt
       print "Content-type: text/html\n\n";

    print "Content-type: application/octet-stream\n\n";
    schreiben??

    Im Prinzip ja (für das, was Du offenbar willst), besser aber den MIME-Typ, der zu Deinem Dateityp paßt.
    (Vielleicht will der Client ja, daß das heruntergeladene Archiv sofort von seinem lokalen WinZip geöffnet wird oder was auch immer?)

    Wie sende ich dann die Datei an den browser, damit der benutzer sie lokal speichern kann??

    Genau wie ein HTML-Dokument: Datei öffnen, Inhalt ausgeben, Datei schließen.