/ 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 skjult fil
Fra : Kim Ludvigsen


Dato : 10-05-09 00:09

Jeg skal starte en download af en pdf-fil (cirka 7 MB) fra
en php-fil, og filen skal kun kunne downloades via php-filen.

Er det muligt at gøre det, så filen på serveren har ét navn,
fx "hemmelig.fil", mens den modtagne fil vil få et andet
navn, som fx "min.fil"? Altså så modtageren ikke selv kan
starte en download ud fra filnavnet.

Ellers nogle forslag til, hvordan det kan gøres?

--
Mvh. Kim Ludvigsen
http://ordforklaring.dk

 
 
Kim Ludvigsen (10-05-2009)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-05-09 01:10

Kim Ludvigsen skrev:

> Er det muligt at gøre det, så filen på serveren har ét navn, fx
> "hemmelig.fil", mens den modtagne fil vil få et andet navn, som fx
> "min.fil"? Altså så modtageren ikke selv kan starte en download ud fra
> filnavnet.

Jeg fandt en løsning her:
http://stackoverflow.com/questions/40943/how-to-automatically-start-a-download-in-php

--
Mvh. Kim Ludvigsen
http://kimludvigsen.dk

Bertel Lund Hansen (10-05-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-05-09 05:04

Kim Ludvigsen skrev:

> Jeg fandt en løsning her:
> http://stackoverflow.com/questions/40943/how-to-automatically-start-a-download-in-php

Hvordan forhindrer det at man bare selv henter filen direkte?

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Dan Storm (10-05-2009)
Kommentar
Fra : Dan Storm


Dato : 10-05-09 10:31

Bertel Lund Hansen skrev:
>
> Hvordan forhindrer det at man bare selv henter filen direkte?
>


<?php

//fil der ligger uden for http
$file = "/usr/data/www/files/vigtigt.pdf";

/**
* noget kode her der muligvis tæller antal downloads eller
* kontrollerer om brugeren har rettigheder til at downloade
* den pågældende fil
*/

header("Content-Disposition: attachment; filename=\"vigtigt.pdf\"");
header("Content-Type: application/pdf");
header("Content-Length: " . filesize($file));
header("Connection: close");

echo file_get_contents($file);

?>





--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Bertel Lund Hansen (10-05-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-05-09 11:56

Dan Storm skrev:

> //fil der ligger uden for http

[Klasken for panden]

Nåh ja.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Kim Ludvigsen (10-05-2009)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-05-09 11:35

Dan Storm skrev:
> Bertel Lund Hansen skrev:
>>
>> Hvordan forhindrer det at man bare selv henter filen direkte?
>
> <?php
> //fil der ligger uden for http
> $file = "/usr/data/www/files/vigtigt.pdf";

....

Jeg har i stedet gjort det således:

$hemmeligtfilnavn = "hemmelig.pdf";
$filnavn = "Min.pdf";

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' .
basename($filnavn) . '"');
header('Content-Transfer-Encoding: binary');
readfile($hemmeligtfilnavn);
header("Connection: close");

Jeg har efterfølgende læst - men endnu ikke fået testet - at
det måske ikke virker i IE7 på grund af et cache-problem,
men at denne kode skulle virke der:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,
pre-check=0");
header("Cache-Control: private",false);
header ( "Content-Type: application/pdf" );
header("Content-Disposition: attachment;
filename=\"".$FileObj->name."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$filesize);
readfile($file);
exit;

--
Mvh. Kim Ludvigsen
http://kimludvigsen.dk


Dan Storm (10-05-2009)
Kommentar
Fra : Dan Storm


Dato : 10-05-09 13:05

Kim Ludvigsen skrev:
> Jeg har i stedet gjort det således:
>
> $hemmeligtfilnavn = "hemmelig.pdf";
> $filnavn = "Min.pdf";
>
> header('Content-type: application/pdf');
> header('Content-Disposition: attachment; filename="' .
> basename($filnavn) . '"');
> header('Content-Transfer-Encoding: binary');
> readfile($hemmeligtfilnavn);
> header("Connection: close");

Det kunne nemt tænkes der også ville være problematik i at du sender en
header efter du har kørt readfile(). Den downloadede fil bør indeholde
en fejlmelding fra PHP sidst i filen.

> Jeg har efterfølgende læst - men endnu ikke fået testet - at det måske
> ikke virker i IE7 på grund af et cache-problem, men at denne kode skulle
> virke der:
>
> header("Pragma: public");
> header("Expires: 0");
> header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
> header("Cache-Control: private",false);
> header ( "Content-Type: application/pdf" );
> header("Content-Disposition: attachment;
> filename=\"".$FileObj->name."\";");
> header("Content-Transfer-Encoding: binary");
> header("Content-Length: ".$filesize);
> readfile($file);
> exit;
>

Jeg er ikke sikker på at jeg ser problematikken. Hvis den rigtige header
kommer med, bør IE også reagere efter den. Alternativt kan du forsøge
dig med at sætte Content-Type til application/zip - det har ingen
betydning for den downloadede fil.

--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

Kim Ludvigsen (10-05-2009)
Kommentar
Fra : Kim Ludvigsen


Dato : 10-05-09 19:28

Dan Storm skrev:
> Kim Ludvigsen skrev:
>> Jeg har i stedet gjort det således:
>>
....
>> readfile($hemmeligtfilnavn);
>> header("Connection: close");
>
> Det kunne nemt tænkes der også ville være problematik i at du sender en
> header efter du har kørt readfile(). Den downloadede fil bør indeholde
> en fejlmelding fra PHP sidst i filen.

Jeg må krybe til korset og erkende, at den sidste linje ikke
var med i den oprindelige kode. Jeg så den i et andet
eksempel, og indsatte den så i min kode, fordi jeg troede,
det var bedst at afslutte med en connection: close.

--
Mvh. Kim Ludvigsen
http://pc-sikkerhed.dk

Dan Storm (10-05-2009)
Kommentar
Fra : Dan Storm


Dato : 10-05-09 20:26

Kim Ludvigsen skrev:
> Jeg må krybe til korset og erkende, at den sidste linje ikke var med i
> den oprindelige kode. Jeg så den i et andet eksempel, og indsatte den
> så i min kode, fordi jeg troede, det var bedst at afslutte med en
> connection: close.

Jeg er faktisk ikke sikker på hvilken effekt Connection: close har i
denne sammenhæng - ej heller hvilken konsekvens den har for klienten;
mit umiddelbare gæt vil være ingen.

--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

N/A (13-05-2009)
Kommentar
Fra : N/A


Dato : 13-05-09 20:54



N/A (13-05-2009)
Kommentar
Fra : N/A


Dato : 13-05-09 20:54



Kim Emax (13-05-2009)
Kommentar
Fra : Kim Emax


Dato : 13-05-09 13:31

On 10 Maj, 14:04, Dan Storm <shadyz_REMOVETH...@err0r.dk> wrote:

> > header('Content-type: application/pdf');
> > header('Content-Disposition: attachment; filename="' .
> > basename($filnavn) . '"');
> > header('Content-Transfer-Encoding: binary');
> > readfile($hemmeligtfilnavn);
> > header("Connection: close");
>
> Det kunne nemt tænkes der også ville være problematik i at du sender en
> header efter du har kørt readfile(). Den downloadede fil bør indeholde
> en fejlmelding fra PHP sidst i filen.

Nej, for headeren er startet og da det er en pdf, så outputter readfile
() ikke noget til skærmen.

Men jeg ville for en god (programmerings) ordens skyld lade headerne
komme i rækkefølge og derefter content....

--
Mvh
Kim Emax

Dan Storm (13-05-2009)
Kommentar
Fra : Dan Storm


Dato : 13-05-09 20:54

Kim Emax skrev:
> Nej, for headeren er startet og da det er en pdf, så outputter readfile
> () ikke noget til skærmen.

Du sludrer... <url: http://php.net/readfile>
Beskrivelsen angiver selv at:
Reads a file and writes it to the output buffer.

Hvordan hænger det sammen med det du siger?

> Men jeg ville for en god (programmerings) ordens skyld lade headerne
> komme i rækkefølge og derefter content....

Det handler ikke om 'god ordens skyld'. Du skal da bare prøve det af, så
kan du se jeg har ret.

--
Dan Storm - storm at err0r dot dk / http://err0r.dk

Tro ikke brugerne vil gøre noget for at undgå dit killfilter
- Så vigtig er du heller ikke!

N/A (13-05-2009)
Kommentar
Fra : N/A


Dato : 13-05-09 20:54



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

Månedens bedste
Årets bedste
Sidste års bedste