[JavaScript:] Seite sichern

maceis

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
hallo zusammen,

ich arbeite eigentlich so gut wie nie mit Javascript und habe dementsprechend wenig Ahnung.

Ich möchte folgendes Ziel erreichen.
Auf einer Webseite soll es einen Link geben, der auf eine Textdatei zeigt.
Wenn der link angeklickt wird. soll sich die Textdatei im Browser öffnen - soweit kein Problem.
Nun soll sich aber ein Sichern/Speichern Dialog öffnen, der es dem benutzer erlaubt, die Seite komfortabel abzuspeichern.
Irgendwie muss das wohl mir dem Kommando "document.execCommand('SaveAs')" gehen, aber ich weiss nicht genau wie.

Noch schöner wäre es, wenn eine HTML Seite aufgerufen wird, die den Text enthält und einen [Sichern] Button. Wenn man den anklickt, soll aber nicht die HTML Seite gespeichert werden, sondern nur die Text Seite.
Man müsste also bei dem Sichern Kommando eine andere Datei auf dem Server zum Speichern angeben können.
Geht das?
 
Da kommst Du mit JavaScript nicht weit. document.execCommand ist JScript, funktioniert also nur im IE. Eine allgemeine Lösung auf JavaScript-Basis gibt es nicht.

Vielleicht kannst Du hiermit was anfangen: Biete Die Datei direkt zum Download an. Einen Download kannst Du per Header erzwingen. Du könntest mit dem Sichern-Button die Text-Datei mit Download-Header in einem versteckten IFrame laden.
 
Die Idee mit dem Download erzwingen hatte ich auch schon, wusste aber nicht, wie das geht.
Wenn ich Dich richtig verstanden habe, kann ich einen Link auf einen Textdatei setzen, die dann heruntergeladen wird. Ich verstehe nur noch nicht ganz, wie ich verhindere, das die txt Datei im Browser angezeigt wird.
Die heruntergeladene Date soll ja keine HTML o.ä. mehr enthalten.

Im schlimmsten Fall mach ich das mit einen CGI Skript, aber ich dachte, das geht vielleicht auch anders/einfacher.
 
Eine einfachere Möglichkeit kenne ich leider auch nicht. Du musst nur ein paar Headerwerte setzen. Geht mit CGI, weis aber nicht wie. :) Mit PHP könnte es so aussehen (Beispiel aus dem PHP-Manual):
Code:
$filecontent="Some text/code im creating in the script";
$downloadfile="somefile.txt";

header("Content-disposition: attachment; filename=$downloadfile");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".strlen($filecontent));
header("Pragma: no-cache");
header("Expires: 0");
 
Danke für den Hinweis.
Zwischenzeitlich habe ich mir schon selbst ein CGI Skript gebastelt.
Header setzen ist eigentlich ganz simpel, man gibt sie einfach mit print aus (natürlich an der richtigen Stelle).

So sieht meine Lösung aus. Vielleicht kann es ja mal jemand brauchen.
Code:
#!/usr/bin/perl

use strict;
use warnings;
# use CGI::Carp qw(fatalsToBrowser);

my $filename    = "Dateiname.txt";
my $docroot     = $ENV{DOCUMENT_ROOT};
my $filesize    = (stat("$docroot/$filename"))[7];

open(FH,'<',"$docroot/$filename") or die "Fehler: $filename \n$!!";
my @file = <FH>; 

print "Content-Type: application/octet-stream\n";
print "Transfer-Encoding: binary\n";
print "Content-Disposition: attachment; filename=$filename\n";
print "Content-Lenght: $filesize\n\n";
print @file;
Das einzge was mich wundert, ist, dass die Dateigröße nicht richtig übermittelt wird. Safari zeigt da z.B. ein Fragezeichen an.

Den Dateinamen könnte man noch aus dem Request-URI extrahieren, aber das ist ein anderes Thema.

BTW:
header("Content-Transfer-Encoding: binary");
ist übrigens nicht Teil des HTTP Standards; Content-Transfer-Encoding wird von MIME verwendet und nicht von HTTP.
HTTP verwendet Content-Encoding und Transfer-Encoding mit jeweils unterschiedlichen Bedeutungen.
Content-Disposition ist eigentlich auch nicht Teil des HTTP Standards, wird aber von vielen Clients ausgewertet.
 
Zurück
Oben Unten