/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
download af filer
Fra : Martin Møller Bæk


Dato : 01-07-03 12:34

Jeg har brug for en download funktion, brugere klikker på et link
til en fil (download.php) med parametre istedet til selve filen.
download.php skal så opstarte en filoverførsel dialog.

Jeg har fundet frem til noget kode, men den virker ikke ved
alle filer. Jeg har kun fået tekst filer til at virke. Ved andre
fil-typer overfører den kun nogle få kb, så filerne ikke duer.
Er der nogen, der kan hjælpe?

Min kode, ser (i den korte version) sådan ud:

<?
$dir = 'data/';
$filename = $_GET['file'];

header("Content-type: application/octetstream");
header("Content-disposition: attachment; filename=".$filename);
header('Cache-Control: private');
header('Pragma: no-cache');
header("Expires: 0");

$client=getenv("HTTP_USER_AGENT");
$fp=fopen($dir.$filename,"r");
$str=fread($fp,filesize($dir.$filename));
print($str);
fclose($fp);
?>

--
mvh
Martin MB
www.yavi.dk
www.web2matic.dk



 
 
Troels Arvin (01-07-2003)
Kommentar
Fra : Troels Arvin


Dato : 01-07-03 13:01

On Tue, 01 Jul 2003 13:33:30 +0200, Martin Møller Bæk wrote:

> Jeg har fundet frem til noget kode, men den virker ikke ved alle filer.

Lige gyldigt hvor mange tricks, du benytter: Du kan ikke være sikker på,
at du kan trigge alle browsere til at præsentere en download-dialogboks:
Nogle systemer er så belastende, at de mener at kunne vælge for brugeren
og vise URL'en in-line i stedet for at tilbyde download.

Jeg har rodet lidt med den slags på
http://troels.arvin.dk/word-download-test/ og min konklusion var desværre,
at man ikke kunne være på den helt sikre side, når der var Internet Explorer
browsere involveret.

> header("Content-type: application/octetstream");
Det hedder "application/octet-stream".

Visse browsere kan godt lidt at få "application/x-msdownload" som
content-type, hvis en download-dialogboks skal vises. Det skader ikke at
benytte denne content-type, idet andre browsere ikke kender mime-typen og
derfor spørger brugere, hvad der skal ske.

> header("Expires: 0");

En expires-header skal have en dato+tid værdi. Jeg ved godt, at Microsoft
i visse sammenhænge anbefaler "Expires: 0", men som jeg læser
standarderne, er 0 en ugyldig værdi, og browserens opførsel er da
uforudsigelig. Bedre: Vælg en dato i fortiden, hvis du endelig vil benytte
tricks med Expires-headers (det burde ikke være nødvendigt, når du har sat
Cache-Control og Pragma som du har).

/Troels


Nezar Nielsen (01-07-2003)
Kommentar
Fra : Nezar Nielsen


Dato : 01-07-03 13:05

Martin Møller Bæk wrote:

> Jeg har fundet frem til noget kode, men den virker ikke ved
> alle filer. Jeg har kun fået tekst filer til at virke. Ved andre
> fil-typer overfører den kun nogle få kb, så filerne ikke duer.
> Er der nogen, der kan hjælpe?

Hvad med at erstatte nedenstående med:

readfile($dir.$filename);

> $fp=fopen($dir.$filename,"r");
> $str=fread($fp,filesize($dir.$filename));
> print($str);
> fclose($fp);


Iøvrigt lidt risky at bare tillade folk udefra at specificere hvilken
fil de gerne vil ha.
(f.eks download.php?file=../../../../../etc/passwd )

Hvis det er større filer der skal downloades vil folk sikkert være glade
for at kunne få at vide hvor stor filen er med en Content-length header..

--
Mvh. Nezar Nielsen
http://fez.dk/


Martin Møller Bæk (01-07-2003)
Kommentar
Fra : Martin Møller Bæk


Dato : 01-07-03 13:24

"Nezar Nielsen" <tumpen@fez.dk> skrev i en meddelelse
news:bdrt85$105v58$1@ID-179598.news.dfncis.de...
> Hvad med at erstatte nedenstående med:
>
> readfile($dir.$filename);

Det var det, der skulle til for at det fungerer.

> Iøvrigt lidt risky at bare tillade folk udefra at specificere hvilken
> fil de gerne vil ha.
> (f.eks download.php?file=../../../../../etc/passwd )

Det er jeg med på. Nu skrev jeg også, at det "i den korte version",
hvilket betyder at den slags detaljer var udeladt.

> Hvis det er større filer der skal downloades vil folk sikkert være glade
> for at kunne få at vide hvor stor filen er med en Content-length header..

Ok. Er det sådan her, man skal gøre:
header("Content-length: ".filesize($dir.$filename));

og hvordan vil dette blive synligt for brugeren.

Og så tak for hjælpen, også til Troels.

--
mvh
Martin MB
www.yavi.dk
www.web2matic.dk



Nezar Nielsen (01-07-2003)
Kommentar
Fra : Nezar Nielsen


Dato : 01-07-03 14:20

Martin Møller Bæk wrote:

>>Iøvrigt lidt risky at bare tillade folk udefra at specificere hvilken
>>fil de gerne vil ha.
...
>
> Det er jeg med på. Nu skrev jeg også, at det "i den korte version",
> hvilket betyder at den slags detaljer var udeladt.

ah ok :)

>>Hvis det er større filer der skal downloades vil folk sikkert være glade
>>for at kunne få at vide hvor stor filen er med en Content-length header..
>
>
> Ok. Er det sådan her, man skal gøre:
> header("Content-length: ".filesize($dir.$filename));

That should do it, ja.

> og hvordan vil dette blive synligt for brugeren.

Jeg taler overhovedet ikke af erfaring her, men jeg vil tro at når
browseren har fået at vide hvor meget den skal hente, at den er i stand
til at lave en progressbar og vise estimeret resterende tid, mens den
hvis der ikke er angivet content-length bare viser at den downloader og
hvor langt den er nået.

--
Mvh. Nezar Nielsen
http://fez.dk/


Peter Brodersen (01-07-2003)
Kommentar
Fra : Peter Brodersen


Dato : 01-07-03 23:38

On Tue, 01 Jul 2003 15:19:46 +0200, Nezar Nielsen <tumpen@fez.dk>
wrote:

>Jeg taler overhovedet ikke af erfaring her, men jeg vil tro at når
>browseren har fået at vide hvor meget den skal hente, at den er i stand
>til at lave en progressbar og vise estimeret resterende tid, mens den
>hvis der ikke er angivet content-length bare viser at den downloader og
>hvor langt den er nået.

Præcis.

Er der i øvrigt nogen, der har kendskab til gode
"fil-dispatcher"-klasser i PEAR/PHP, der selv kan finde ud af at
modtage og sende passende HTTP-headers (inkl. conditional requests,
ranges, etc.)?

--
- Peter Brodersen

Johan Holst Nielsen (02-07-2003)
Kommentar
Fra : Johan Holst Nielsen


Dato : 02-07-03 14:55

Peter Brodersen wrote:
> On Tue, 01 Jul 2003 15:19:46 +0200, Nezar Nielsen <tumpen@fez.dk>
> wrote:
>
> Er der i øvrigt nogen, der har kendskab til gode
> "fil-dispatcher"-klasser i PEAR/PHP, der selv kan finde ud af at
> modtage og sende passende HTTP-headers (inkl. conditional requests,
> ranges, etc.)?

Jeg har haft lavet noget til noget dokumenthåntering engang... kan prøve
at lede i arkivet ;) Men kan desværre nok ikke blive før August pga.
ferie, flytning mm. ;)

Men burde nemt kunne omskrives således den passer med PEAR syntax...

mvh
johan


C (02-07-2003)
Kommentar
Fra : C


Dato : 02-07-03 09:41

Hej
Jeg kunne godt tænke mig samme funktion på en af mine sider.... Altså med at
man kan se størrelse på filen
Men hvor skal koden indsættes ? Det er på en .php side:
http://www.fals.dk/sonofon/sitemap.php

Pft Christian




Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408935
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste