Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]2942[/thread]

Download bricht Ladevorgang der Webseite ab



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
perli
 2005-06-27 17:53
#29513 #29513
User since
2003-09-12
23 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein Perl Programm MAIN, das eine HTML Seite erstellt mit verschiedenen Eingabefeldern. Mit einem Button "Senden", werden die Daten auf dem Server in eine Datei geschrieben und diese Datei möchte ich dem User als Download anbieten.
"Senden" ruft MAIN wieder auf und schreibt die Daten weg. Weiterhin rufe ich mit dem Javascript Befehl window.open(...) ein Download Perl Programm auf, das mir die Datei downloaded und danach möchte ich mein Formular wieder anzeigen.
Der Download funktioniert, jedoch bewirkt der window.open Aufruf, daß mein MAIN Programm danach nicht mehr abgearbeitet wird. Außerdem wird durch den window.open Aufruf kein neues Fenster erzeugt?

Bin am Verzweifeln. Wäre SUPER, wenn einer ne Idee hätte.

Danke im voraus & Gruß,
Roger
Strat
 2005-06-27 18:10
#29514 #29514
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
kannst du den code auf ein minimum bringen und hier posten? kann mir nicht so recht vorstellen, was dein problem sein koennte
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
perli
 2005-06-27 19:10
#29515 #29515
User since
2003-09-12
23 Artikel
BenutzerIn
[default_avatar]
...so...
Hallo,

die Frage war nicht schlecht :-)
Jetzt habe ich das Ganze mal ein wenig abstrahiert.

In dem folgenden Code wird einfach nur eine Datei test.txt downgeloaded, wenn man Senden drückt. Feldwert ist egal.

Mein Problem ist nun, daß meine Seite nicht neu geladen wird, also der alert('aha') nicht ausgeführt wird.

Wenn ich das Ganze in einem eigenen Fenster aufrufe mit window.open, bleibt beim Canceln das neue Fenster stehen. Außerdem sieht das zusätzlich Fenster blöd aus und ist unnötig.

Idee?

Danke & Gruß,
 Roger

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl -w

use strict;
use CGI qw(:standard escapeHTML);
use CGI::Carp qw(fatalsToBrowser);

my $ausgabe = "";
my $downloadaufruf = "";

my $wert   = param('wert')   || "";
my $button = param('action') || "";

if ($button eq "Senden") {
 $ausgabe .= "...senden gedrückt...<br>";
 $ausgabe .= "Wert = $wert <br>";
 download("test.txt");
 $downloadaufruf = "alert('aha');";
}

my $html = <<"(END OUT HTML)";
 <html><head>
 <title>Test</title>
 <script language=\"JavaScript\">
 <!--
    $downloadaufruf
 // -->
 </script>
 </head>
 <body>
 <FORM METHOD="POST">
 $ausgabe
 <input type="text" name="wert">
 <input type="submit" name="action" value="Senden">
 </FORM>
 </body>
 </html>
(END OUT HTML)

print "Content-Type: text/html\n\n",
     $html;
1;

sub download {
 my $file = shift;
 print "Content-Type: application/octet-stream\n";
 print "Content-Disposition: attachment; filename=$file\n\n";
 open(FH,"<$file");# || die "mist";
 binmode FH;
 binmode STDOUT;
 print while(<FH>);
 close FH;  
}
GwenDragon
 2005-06-27 20:54
#29516 #29516
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
download() wird aufgerufen, wenn vorher der Senden-Button betätigt wurde. Wenn du download() aufrufst, wird ja der Content-Type application/octet-stream und der Inhalt der Datei zurück gegeben.
Und danach kommt dann noch die HTML-Datei mit text/html.
Entweder, oder.

Das geht nicht, deswegen ignoriert der Browser das alert etc.\n\n

<!--EDIT|GwenDragon|1119891627-->
perli
 2005-06-28 11:06
#29517 #29517
User since
2003-09-12
23 Artikel
BenutzerIn
[default_avatar]
Hallo,

ja, das ist mir so weit klar. Aber wie kann ich das Problem lösen? Wie kann ich das Laden der Seiten UND den Download Vorgang bewirken?

Gruß,
Roger
GwenDragon
 2005-06-28 12:50
#29518 #29518
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/perl -w

use strict;
use warnings;
use CGI qw(:standard escapeHTML);
use CGI::Carp qw(fatalsToBrowser);

my $ausgabe = "";
my $downloadaufruf = "";

my $wert   = param('wert')   || "";
my $button = param('action') || "";

if ($button eq "Senden") {
$ausgabe .= "...senden gedrückt...<br>";
$ausgabe .= "Wert = $wert <br>";

$downloadaufruf = "getfile('?action=Download&file=test.txt'); alert('aha');";
}
elsif ($button eq "Download") {
   my $file = param('file');
   download($file);
   
   exit;
}

my $html = <<"(END OUT HTML)";
<html><head>
<title>Test</title>
<script language=\"JavaScript\" type=\"text/javascript\"><!--
var dlwin = NULL;
function getfile(url) {
   dlwin = window.open( url, \"downloadw\", \"width=200,height=200,dependent=yes\");
}
// -->
</script>
</head>
<body onunload="if (dlwin) dlwin.close()">
<script language=\"JavaScript\" type=\"text/javascript\">
<!--
   $downloadaufruf
// -->
</script>
<noscript><h1>Der Download funktioniert nur mit Javascript!
<br>Bitte Javascript aktivieren!</h1></noscript>

<FORM METHOD="POST">
$ausgabe
<input type="text" name="wert">
<input type="submit" name="action" value="Senden">
</FORM>
</body>
</html>
(END OUT HTML)

print CGI::header( -type => "text/html"), $html;
1;

sub download {
my $file = shift;

# Zur Sicherheit
my $safedir = "/hier/das/Verzeichnis/der/Downloaddateien/";
# Zur Sicherheit
if ( $file =~ /^[A-Z0-9_]+\.[A-Z0-9_]+/i ) { # Dateiname besteht nur aus abcdef.extension !
   $file = $safedir . $file;

   print CGI::header( -type => "application/octet-stream", -attachment => $file );
   open(FH,"<$file") || return undef;
   binmode FH;
   binmode STDOUT;
   print while(<FH>);
   close FH;  
   return 1;
}
else {
   return undef; # Fehler
}
   
}
NICHT lang ausgetestet!!!

Es ist möglich in einem zweiten Fenster den Download an zu stoßen, aber ... Es ist dann nicht klar, wann das Fenster wieder zu gemacht werden kann. Derzeit schließt sich das Fenster, wenn die Seite gewechselt wird.
Schließlich weiß das Javascript nicht, ob der Download beendet ist. Das ist ja nicht so wie beim Downloadfenster des Browsers.

Hmmm. Mir ist noch nichts eingefallen dazu.\n\n

<!--EDIT|GwenDragon|1119955506-->
perli
 2005-06-28 13:52
#29519 #29519
User since
2003-09-12
23 Artikel
BenutzerIn
[default_avatar]
Danke schon mal für die Mühe & Anregung
Gruß,
Roger
Strat
 2005-06-28 13:55
#29520 #29520
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
viele verwenden dafuer den folgenden weg; sie zeigen die ausgabeseite an und leiten per meta http-equiv="refresh" an die downloaddatei weiter, z.B.
[html]
<meta http-equiv="refresh" content="1; URL=http://myserver.xyz/downloads/file.bin">
[/html]
und zusaetzlich stellen sie diesen link nochmal dar, falls bei jemandem der refresh nicht funktioniert, mit der meldung.... "wenn der download nicht innerhalb ein paar sekunden beginnt, klicke auf diesen link"...
hat den vorteil, dass es ohne javascript auskommt
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2005-06-28 14:36
#29521 #29521
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ja sicher, mit Refresh geht es.
Aber dann fehlt ihm ja sein alert. Oder war das nur zum Test?
Mir ist nicht so hganz klar, was das Javascript noch machen soll.

Quote
Wie kann ich das Laden der Seiten UND den Download Vorgang bewirken?
Er will ja Download haben und die Seite anzeigen!\n\n

<!--EDIT|GwenDragon|1119955820-->
perli
 2005-06-28 15:05
#29522 #29522
User since
2003-09-12
23 Artikel
BenutzerIn
[default_avatar]
Der alert ist wichtig! Da passieren nachher noch mehr Dinge. Der alert ist ein Beispiel.
Es ist richtig, daß ich beides parallel möchte.
Roger
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-06-27 17:53.