Avatar billede nazaq Nybegynder
08. maj 2001 - 15:52 Der er 10 kommentarer og
1 løsning

download.pl script

Hej
Jeg er totalt nybegynder mht. perl cgi scripts så bær venligst over med mig.

Jeg har det problem at jeg gerne vil skjule en evt. sti til en fil som kan downloades fra en web side. Jeg forestillede mig et link så som /cgi-bin/download.pl?/filnavn.ext der så får en download box op hvor man kan vælge hvor det man downloader skal gemmes.
Avatar billede Thomas Nybegynder
08. maj 2001 - 15:58 #1
Du kan gøre det snedige at lave http headers som referer til en anden sti med location..
altså noget ala....

#!/usr/bin/perl
$fil = \"minfil/placering\";
print \"Location: $fil\\n\";

Jeg er dog umiddelbart lidt i tvivl om, om man får stien vist når den redirecter.... men prøv i første omgang!
Avatar billede thomasledet Nybegynder
13. maj 2001 - 17:50 #2
Du kunne selvfølgelig også åbne filen og udskrive den som output....

#!/usr/bin/perl

open(SJOV, filnavn.noget) || die(\'Hovsa!\');
@var=<SJOV>;
close(SJOV) || die (\'Øv!\');
print \"Content-type: din filtype\"\\n\\n\";
foreach (@var)
{
print $_;
}

noget i den retning... sidder du på en windoze maskine skal du nok overveje at sætte binmode...
Avatar billede thomasledet Nybegynder
13. maj 2001 - 21:52 #3
hmm... på mystisk vis har der vist sneget sig et \" for meget ind i print content-type linien...
Avatar billede thomasledet Nybegynder
15. maj 2001 - 00:24 #4
mit ovenstående svar virker egentlig kun med tekstfiler, nu jeg tænker mig om... hvad du leder efter er nok mere noget i retning af-->

#!/usr/bin/perl

$filnavn=$ENV{\'QUERY_STRING\'};
$filnavn=~ s/~!/ ~!/g;
$filnavn=~tr/+/ /;
$filnavn=~s/%([a-fA-F0-9][a-fA-F0-9])/pack(\"C\", hex($1))/eg;
$filnavn=~s/\\n//gi;
$filnavn=~s/\\///g;
$filnavn=~s/\\\\//g;

open(SJOV, \"</home/absoluttebrugersti/$filnavn\" ) or die(\"Øv!: $!\\n\");
print \"Content-type: dinfiltype\\r\\n\\r\\n\";
binmode(SJOV);
binmode(STDOUT);
while ($cb=read(SJOV, $data, 4096))
{
    print $data;
}
close(SJOV) or die(\"Øv!: $!\\n\");

<-- det skulle faktisk gøre tricket... helt og holdent...

scriptet skal så kaldes således her: http://www.domæne.xyz/cgi-bin/download.pl?filnavn

det er forøvrigt ret vigtigt, at du angiver den absolutte sti til dine filer, da du ellers giver alle og enhver idiot ret til at læse alle filer på din maskine... og det er ikke godt...

der hvor der står dinfiltype skal du forøvrgt angive, hvilken type fil, du ønsker at sende afsted... så det er lettest for dig, hvis du har alle dine filer i samme format, ex .tar.gz eller zip... .exe-filer o.l. kan selvfølgelig også bruges... bare du skriver hvilken type fil du ønsker at sende... ønsker du fx at sende en .jpg fil skal der stå print \"Content-type: image/jpeg\\r\\n\\r\\n\";

held og lykke med det!
Avatar billede thomasledet Nybegynder
21. maj 2001 - 15:16 #5
kan du bruge svaret til noget?
Avatar billede nazaq Nybegynder
05. juni 2001 - 12:46 #6
Ja og så ikke helt men du kan jo ikke læse tanker vel :-)

Jeg har fundet ud af at det jeg gerne vil ikke helt kan lade sig gøre men dit svar er nok det tætteste.

Det jeg egentligt gerne ville var at uanset Cuntent-Type så skulle browseren spørge om \'save-as\' hvilket den ikke gør hvis den kender fil typen (eks. pdf)

/Nazaq
Avatar billede thomasledet Nybegynder
05. juni 2001 - 12:57 #7
du kan måske sætte content-type til eet eller andet mærkeligt, således at du er sikker på, at ingen browser kender det... så burde den bare hente det...

det kunne være noget i retning af \"Content-type: image/zxgh\\n\\n\".... det dur måske... prøv dig frem... det KAN næsten med garanti lade sig gøre...
Avatar billede nazaq Nybegynder
06. juni 2001 - 09:11 #8
Er prøvet og det er IE totalt ligeglad med.

BTW: her er mit script

#!/perl/bin/perl
use CGI ;
use CGI::Carp qw(fatalsToBrowser);

$query = new CGI;
# hent parametre
my $fil = $query->param(\'fil\');

$fil =~ /([^\\/\\\\]+)$/;
my $name = $1;

open (file,\"<C:/filer\".\"$fil\") || exit print header.$!;
binmode(file);
binmode(STDOUT);
$size = -s file;
$dat = -M file;

read( file, $buf, $size);
close file;
print \"Content-Type: application/octet-stream\\n\";
print \"Accept-Ranges: bytes\\n\";
if ($ENV{\'HTTP_USER_AGENT\'} =~ \"MSIE 5.5\") {
    print \"Content-Disposition: file; filename=\\\"$name\\\"\\n\";
}
    else {print \"Content-Disposition: attachment; filename=\\\"$name\\\"\\n\";
}
print \"Content-Length: $size\\n\\n\";
print $buf;
exit;

DEt virker men ikke helt alligevel, det kunne være rart hvis IE selv spurgte om den skal gemme som eller åbne :-)

/Nazaq
Avatar billede thomasledet Nybegynder
06. juni 2001 - 18:14 #9
Den spørger vel, hvis den ikke kender content-type... alt andet ville da være underligt... er du sikker på, at det ikke kun er din egen ie, der er underligt konfigureret? :)
Avatar billede nazaq Nybegynder
07. juni 2001 - 15:44 #10
Nej min IE er ikke underlig (bortset fra hvordan den normal er)

Hvis jeg vil downloade en .pdf, .doc og .xls (har kun prøvet disse) så spørger IE ikke om noget da den går udfra at knuden (mig) som sidder bag skærmen ikke ved hvad han vil/skal og sikkert har brug for hjælp...

Jeg har nu ledt nettet tyndt og har fundet ud af at hvis IE har spurgt til eet filformat og den har fået at vide den ikke behøver at spørge mere så gør den det ikke mere. Og dette uanset at \'Content-Disposition:\' skal bevirke at \'Gem som..\' dialogen kommer frem. Alle andre browsere reagere som de skal undtagen MS-IE.

/Torben
Avatar billede thomasledet Nybegynder
07. juni 2001 - 18:36 #11
mærkelig skodbrowser... brug den nye mozilla i stedet...:)

http://www.mozilla.org/releases/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester