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

Datei-Download: Kleines Problem

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Gast Gast
 2004-05-02 19:48
#2299 #2299
Also ich habe ...
- eine Datenbank oder ein Verzeichnis
- Scripts die dort gespeichert sind
- ein Script das eine HTML-Seite mit Links zu den
  gespeicherten Scripten erzeugt.

Wie mache ich das nun, dass beim Klick auf den Link das Downloadfenster aufgeht und im Fenster der Name der Datei erscheint?
Momentan sieht es so aus, dass sich das Downloadfenster erwartungsgemäß öffnet, aber als Dateiname erscheint der Name des Scripts das gerade ausgeführt wird/wurde.

Hat da jemand von Euch einen Tipp für mich?
esskar
 2004-05-02 20:07
#2300 #2300
User since
2003-08-04
7321 Artikel
ModeratorIn

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
sub get_filename
{
my ($file) = @_;
$file =~ s!\\!/!g; # chnage windows path as needed
my @parts = split /\//, $file;
return pop @parts;
}
sub send_file_to_browser
{
my ($file) = @_;
my $name = get_filename($file);
$name =~ s! !%20!g;
$name ||= "[N/A]";

print "Content-Disposition: inline; filename=\"$name\"\n";
print "Content-Type: application/octet-stream\n\n";

send_binaryfile_to_browser($file);

1;
}

sub send_binaryfile_to_browser
{
my ($file) = @_;

binmode STDOUT;
if(open(FILE, "< $file"))
{
binmode FILE;

while(<FILE>) { print $_; }

close FILE;
}
}
Gast Gast
 2004-05-02 20:21
#2301 #2301
Das kam ja wie aus der Pistole geschossen ... ;)
Danke esskar.

Quote
 print "Content-Disposition: inline; filename=\"$name\"\n";


Das kannte ich noch nicht.\n\n

<!--EDIT|Dieter|1083514936-->
betterworld
 2004-05-02 20:24
#2302 #2302
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
esskars Loesung kannte ich noch gar nicht. Ich hatte das Problem neulich auch und habe es geloest, indem ich einfach einen Link auf script.pl/dateiname gesetzt habe. Wenn der Dateiname dynamisch erzeugt wird, kann man es auch so machen:

Code: (dl )
1
2
3
4
5
6
if($ENV{PATH_INFO}) {
print "Content-Type: application/octet-stream\n\n";
print $inhalt;
} else {
print "Location: http://host/cgi-bin/script.pl/$dateiname\n\n";
}

(nicht getestet)

Aber wahrscheinlich ist esskars Loesung da besser.
esskar
 2004-05-02 20:32
#2303 #2303
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Dieter,02.05.2004, 18:21]Das kannte ich noch nicht.[/quote]
Bin damals drauf gekommen als ich viel mit Mails und MIME zu tun hatte; da ist es ja ähnlich und da sich die Formate auch sonst ähneln, hatte ich es auf einen Versuch ankommen lassen!
Gast Gast
 2004-05-02 20:32
#2304 #2304
[quote=betterworld,02.05.2004, 18:24]Aber wahrscheinlich ist esskars Loesung da besser.[/quote]
Denke ich auch ;)
pq
 2004-05-03 14:31
#2305 #2305
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=betterworld,02.05.2004, 18:24]Aber wahrscheinlich ist esskars Loesung da besser.[/quote]
ich weiss nicht; ich mache es immer mit PATH_INFO, so wie in deiner lösung.
das versteht jeder browser, denn für den browser sieht es eben aus wie
eine reguläre datei. der header dagegen wird glaube ich nicht von allen browsern verstanden.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2004-05-03 15:06
#2306 #2306
[quote=pq,03.05.2004, 12:31]ich weiss nicht; ich mache es immer mit PATH_INFO[/quote]
Klar - jedenfalls solange $ENV{'PATH_INFO'} vom Server geliefert wird ... ;)
Gast Gast
 2004-07-02 18:10
#2307 #2307
[quote=esskar,02.05.2004, 18:32][quote=Dieter,02.05.2004, 18:21]Das kannte ich noch nicht.[/quote]
Bin damals drauf gekommen als ich viel mit Mails und MIME zu tun hatte; da ist es ja ähnlich und da sich die Formate auch sonst ähneln, hatte ich es auf einen Versuch ankommen lassen![/quote]
Wenn ich das so schreibe dann klappt's auch mit dem IE und auch mit solchen Servern die 'application/octet-stream' nicht explizit aufgenommen haben (und die Funktion benötigt dann nur einen Block).
Nochmals Danke für den Hinweis.

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
my $dest = 'c:/inetpub/wwwroot/cgi-bin/the_script.pl';

send_file_to_browser(\$dest);

##################################
sub send_file_to_browser {
##################################
   my $dest = shift;
   my ($file, @path);
   local $_;
   
   chomp $$dest;
   
   $$dest =~ s/\\/\//g;
   @path = split /\//, $$dest;
   
   ($file = $path[-1]) =~ s/\s/_/g;
   
   binmode STDOUT;
   
   print "Content-Type: application/*\n";
   print "Content-Disposition: inline; filename=\"$file\"\n\n";
   
   open FILE, "< $$dest" or die("File $file couldn't be opened");
   binmode FILE;
   print while <FILE>;
   close FILE or die("File $file couldn't be closed");
}
Strat
 2004-07-03 00:28
#2308 #2308
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
beim neuen board habe ich das problem mit den Dateinamen durch eine Rewrite-Rule geloest (allerdings mit mod_perl)....
download.pl ist der Apache::Request-Handler, der die Datei downloaded, und die Rewrite-Rule sieht folgendermaszen aus:
Code: (dl )
RewriteRule /download/(.+)/(.*) /perl-bin/download.pl?file=$1;$2

$1 ist dann der interne name, und $2 der originalname; $2 wird vom Script nicht benoetigt, aber da er am Ende der URL steht, denken die Browser, dass der download so heisst, und waehlen diesen namen bei speichern unter...
Nachteil: man braucht zugriff auf mod_rewrite (z.B. ueber die Apache-Config)...

aber vielleicht baue ich auch mal esskar's weg ins PBoard ein...\n\n

<!--EDIT|Strat|1088800106-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2004-05-02 19:48.