[PHP] Force download werkt niet onder Apache

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 16-09 20:14
Hallo allen,

Ik heb een force download script geschreven die een bestand van rond de 8 MB terugstuurt met de juiste HTTP headers, zodat je een download scherm te zien krijgt.

De code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$download_file = 'downloads/' . $row["DownloadSubDir"] . '/' . $row["DownloadFile$lang"];
if (file_exists($download_file)) {
    // Stuur juiste HTTP headers
    header("Content-Type: application/octet-stream");

    // Workaround voor IE 5.5 bug hier mag geen attachment worden meegegeven
    if (strstr($HTTP_SERVER_VARS["HTTP_USER_AGENT"], "MSIE")) {
        header("Content-Disposition: filename=" . $row["DownloadFile$lang"] . "%20");
    } else {
        header("Content-Disposition: attachment; filename=" . $row["DownloadFile$lang"]);
    }

    header("Connection: close");
    header("Pragma: no-cache");
    
    //$fn = fopen($download_file, "rb");
    readfile($download_file);
    //fpassthru($fn);
    //fclose($fn);
    exit;
} else {
    echo 'file bestaat niet';
}


Onder IIS werkt dit perfect. Bij onze hoster XS4ALL die apache Apache/1.3.27 draaien krijg ik elke keer een Internal server error 500. In de log zie ik daar staan Premature end of script headers. (volgens mij draait PHP als CGI module bij XS4all maar dat weet ik niet zeker)

Ik ben erachter gekomen dat de error zich voordoet bij de regel:
readfile($download_file);

Ik heb al geprobeerd fpassthru te gebruiken, maar dit geeft dezelfde error.
Iemand enige ervaringen met dit probleem?

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 16-09 20:14
Inmiddels ben ik er achter dat het probleem veroorzaakt wordt door de grootte van het bestand. Een bestand van 1,2 MB geeft geen problemen.
Hoe zou ik dit probleem op kunnen lossen? Het bestand niet in 1 keer inlezen maar ik kleine buffertjes misschien? Ik ga het in ieder even geval proberen.

Als iemand nog andere suggesties heeft hoor ik het graag. :)

Editje:
Ben er inmiddels al achter, dankzij de volgende user comment bij de fpassthru functie :)

I wrote a page which authenticates the user, then calls fpassthru() to download an Acrobat document. It worked great up to about 1MB, but for larger files, the script was dying in the middle. My ISP told me they were killing my script because it was a memory hog. I tried readfile() instead, to no avail.
I replaced the fpassthru() with this workaround. It works great:
PHP:
1
2
3
4
while(!feof($fn)) {
  $buffer = fread($fn, 4096);
  print $buffer;
}

[ Voor 45% gewijzigd door pjonk op 13-06-2003 15:34 ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

Verwijderd

heb al aan restricties qua licentie en hostingprovider ged8?

edit: te laat

[ Voor 13% gewijzigd door Verwijderd op 13-06-2003 15:39 ]