Beveiligde download, ouput weergeven voor download begint

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Floris

Floris

14/07/2007 18:23:00
Quote Anchor link
Op een bepaalde pagina moeten gebruikers na betaling een bestand kunnen downloaden. Dit bestand staat om deze reden dus niet in de document root, maar in een map die niet publiekelijk toegangkelijk is. Vervolgens laat ik een script het bestand naar de gebruiker versturen. De functie voor het besturen van het bestand is de volgende:

function SendFile($FileName)
{
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($FileName));
header("Content-Disposition: attachment; filename=\"$FileName\"");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
$fp = fopen($FileName,"rb");
fpassthru($fp);
fclose($fp);
}

Deze pas ik als volgt toe op de pagina (meeste code weggelaten voor de duidelijkhed):

echo "Het bestand wordt gedownload, je kent het openen zo gauw het downloaden is voltooid. Ondertussen kun je gewoon verder kijken op de site, zolang je het download venster maar niet afsluit.";
SendFile($FileName);
//hier nog meer output die moet worden weergegeven

Probleem hiermee is dat de tekst die ik probeer te "echo-en" niet wordt weergegeven. Dit komt denk ik omdat de functie sendfile nog actief is, waardoor de output nog niet naar de browser wordt gestuurd. Ook moet er eigenlijk na de functie sendfile nog output worden weergegeven.

Hoe krijg ik het dus voor elkaar om dat bestand beveiligd te versturen naar de bezoeker, maar ondertussen toch mijn pagina gewoon goed weer te geven??

Ik heb geprobeerd om met flush en ob_flush te werken, voordat de functie sendfile wordt aangeroepen, maar dan werkt het downoaden van het bestand niet meer omdat de sendfile functie headers gebruikt, terwijl deze dan al zijn verstuurd (krijg dus die bijbehorende foutmelding dan: headers already sent).

Iemand een oplossing?
 
PHP hulp

PHP hulp

27/11/2024 23:21:51
 
Arend a

Arend a

14/07/2007 18:51:00
Quote Anchor link
Het is niet helemaal mogelijk wat je wil, en je zult het in twee http requests moeten opsplitsen, je kan niet zowel een html bestand als een octet-stream tegelijkertijd versturen.

Dit wordt doorgaans gedaan door: In eerste instantie slechts de boodschap laten zien, en refreshen/redirecten na een paar seconden naar de url waar je het direct kan downloaden.

Min of meer deze opzet.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?
if ($magDownloaden == 1) {
  if ($_GET["echtDownloaden"] == 1) {
    SendFile($FileName);
  }
else {
    // redirect naar $_SERVER['PHP_SELF']?echtDownloaden=1&welkeinformatiejenogmeermoetmeegeve
    //  en een mooi berichtje meegeven

} else {
  // je mag helemaal niet downloaden
}
?>
 
Floris

Floris

14/07/2007 19:23:00
Quote Anchor link
mm, bedankt. In die richting zat ik zelf ook al te denken, maar ik wou het dus mooier oplossen, dat blijkt nu dus niet mogelijk.

De manier van bestand versturen is dus op zich wel de meeste optimale manier? Ik had die functie namelijk ff via Google gezocht, aangezien ik hier geen ervaring mee had

thanx
 
Arend a

Arend a

14/07/2007 19:50:00
Quote Anchor link
De manier van een bestand doorsturen is op zich niets mis mee. Comments in de php manual hebben het wel over geheugenlekken in fpassthru voor php 5.2.1. Ik heb hier geen ervaring mee, en ik weet ook niet precies hoe php fprassthru behandeld (zet het het hele bestand eerst in het ram en dan pas naar de stdout, of gebeurt dat gelijk?

Maar qua opzet is het buiten de directory zetten en het php laten doorsturen wel de juiste oplossing om je bestanden te beveiligen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.