Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

Downloaden uit beveiligde map met PHP-script

Jan_32
4 antwoorden
  • Op mijn server bevinden zich een aantal .zip en .psd bestanden in de map pad/files. De bestanden kun je pas downloaden nadat er is gecontroleerd, de map pad/files wordt door een " deney all-htaccess" bestand beschermd.
    Nu probeer ik via een php bestandje downloads toe te staan, nadat de controle ok is. Maar met mijn onderstaand scriptje loopt de browser mega-vast.
    Dit wordt ge-included na de controle:
    [code:1:0d933a1937]if(!isset($_SESSION['file'])){
    echo "geen download";
    exit();
    }

    // controle om te kijken of $file er is
    echo $file;
    echo "<br>";
    // ok, begin de download
    if(isset($_SESSION['file']))

    {
    // het juiste pad naar $file weergeven
    $downloadfile = $l."/files/".$_SESSION['file'] ;
    // controle $downloadfile
    echo "<br>";
    echo $downloadfile;
    header('Content-Type: application/octet-stream');
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="'.$downloadfile.'"');
    header('Content-Length: '.filesize($downloadfile));
    readfile($downloadfile);
    } [/code:1:0d933a1937]
    Ik moet bekennen dat ik niet goed weet wat ik doe, ik gebruik een via het net gevonden voorbeeld. Andere voorbeelden resulteren in dezelfde fouten / geen download.
    Als ik enkele "header('Content-Type:…" regels uitschakel krijg ik de foutmelding "Header already sent…." etc.
    Wie kan mij verder op weg helpen om dit werkzaam te krijgen?
  • Het is inderdaad niet mogelijk om content te versturen naar de client en vervolgens nog headers te sturen. Die fout moet je sowieso verhelpen.
    Vervolgens zie een aantal headers dubbel en/of niet helemaal in het correcte formaat.

    Onderstaande is al correcter (maar weet dus niet of dat je probleem verhelpt; heb de code ook niet getest).

    [code:1:0b0fc21ae3]
    <?php
    $file = (isset($_SESSION['file']) ? $_SESSION['file'] : '');
    $downloadfile = $l . "/files/" . $file;

    if(!file_exists($downloadfile))
    {
    echo "geen download";
    exit();
    }
    else
    {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $downloadfile);
    header('Content-Length: ' . filesize($downloadfile));
    readfile($downloadfile);
    }
    ?>
    [/code:1:0b0fc21ae3]

    Als dit nu niet werkt, echo dan de variabele $downloadfile bovenaan het script en breek het script daarna af. Controleer vervolgens of dit pad ook bestaat.

    /edit: ik zie ook een variabele $l, die nergens wordt gedefinieerd. Waar komt deze vandaan?
  • Hallo Annie

    Bedankt voor je reactie. Ik hoop dat je nog wat hulp kunt bieden want nu loopt de browser ook nog vast :-? . De header already-sent melding heb ik niet meer gezien, maar komt misschien nog?
    $l is overigens een deel van het pad naar de locatie van het bestand, maar wordt in $downloadfile correct weergegeven.

    Ik heb je advies gebruikt en werk nu met het volgende script:
    [code:1:b7ccfcea2c]var_dump($_SESSION);

    // De truc:

    $file = (isset($_SESSION['file']) ? $_SESSION['file'] : '');
    $downloadfile ="". $l . "/files/" . $file;

    if(!file_exists($downloadfile))
    {
    echo "geen download";
    echo "<br>1 downloadfile: ";
    echo $downloadfile;
    exit();
    }
    else
    {
    echo "<br>2 downloadfile: ";
    echo $downloadfile;
    // tot hier gaat t goed, het bestand wordt herkend
    // exit();
    // hier gaat t fout:
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $downloadfile);
    header('Content-Length: ' . filesize($downloadfile));
    readfile($downloadfile);
    }[/code:1:b7ccfcea2c]
    Het lijkt er dus op dat het bestand wel wordt herkend, [code:1:b7ccfcea2c]echo "<br>2 downloadfile: ";
    echo $downloadfile;
    [/code:1:b7ccfcea2c] wordt immers aangesproken. Nu danst de browser om de seconde naar een nieuw wit scherm ( de browser opent niet nog eens, zo erg is t nou ook weer niet.) Vervolgens zit IE vast.
    Ik hoop dat je nog een suggestie hebt.
  • Ik neem aan dat je tijdens het testen van de daadwerkelijke download, de echo's uit de [i:74499cce15]else[/i:74499cce15] ook weglaat. De code die je hier post stuurt namelijk wederom content naar de client vóórdat de headers worden verstuurd.

    Als je wil kijken wat je aan data binnen krijgt, zou je eens kunnen kijken naar een tool die het verkeer van en naar je browser monitored. Een voorbeeld daarvan is Fiddler. Maar zulke tools vergen wel een bepaalde basiskennis.

    Mocht je er niet uitkomen, is het dan mogelijk dat je iets online plaatst zodat we kunnen 'meekijken'?

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.