2 Stimmen

Der von PHP angebotene Download wird jedes Mal nach einer Anzahl von X KB unterbrochen

Ich habe einen Code geschrieben, der Besuchern anbietet, eine 1,1M große csv-Datei herunterzuladen. Wenn man dieses Skript besucht, wird der Download um 30-40K unterbrochen (wie unten in der wget-Ausgabe gezeigt), während er über einen direkten Link wie http://domain.com/events.csv Es funktioniert einwandfrei. Ich glaube, dass dies etwas mit den php-Konfigurationswerten auf dem Server zu tun hat, aber ich habe fast mit allen Werten [relevanten und nicht relevanten] gespielt, wie z.B.

  • post_max_size [bis zu 90M]
  • max_file_upload [bis zu 90M]
  • max_execution_time [0 und bis zu 600]
  • max_input_time [0 und bis zu 600]
  • speicher_limit [bis zu 1024M]

Das Folgende enthält meinen Code:

 <?php

$realpath="/home/user/public_html/events.csv";
$size = intval(sprintf("%u", filesize($realpath)));

@ini_set('zlib.output_compression', 0);
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=events.xls"); 
header("Content-Transfer-Encoding: binary ");
header("Pragma: public");
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: pre-check=0, post-check=0, max-age=0');
header ("Pragma: no-cache");
header("Expires: 0");
header("Content-Description: File Transfer");
header("Content-Type: text/csv");
header("Content-Length: ". $size);

// also tried with having a flush(); here
// also tried with file_get_contents();
//also tried with wrapping the file_get_contents() or readfile() call inside ob_start() and ob_flush()+ob_clean()
readfile($realpath);
exit;

?>

Hier ist die wget-Ausgabe

wget "http://domain.com/test.php"
--2011-06-26 19:47:55--  http://domain.com/test.php
Resolving domain.com... 69.117.110.115
Connecting to domain.com|69.117.110.115|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1139844 (1.1M) [text/csv]
Saving to: `test.php'

 3% [===>                                                                                                                            ] 36,373      --.-K/s   in 11s     

2011-06-26 19:48:11 (3.29 KB/s) - Connection closed at byte 36373. Retrying.

--2011-06-26 19:48:12--  (try: 2)  http://domain.com/test.php
Connecting to domain.com|69.117.110.115|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1139844 (1.1M) [text/csv]
Saving to: `test.php'

 3% [===>                                                                                                                            ] 40,469      --.-K/s   in 11s     

2011-06-26 19:48:24 (3.66 KB/s) - Connection closed at byte 40469. Retrying.

Wenn ich den Header() entfernen, der erforderlich ist, um einen Download anzubieten, und nur den Inhalt echo, dann Chrome zeigt, dass die test.php war rund 1.09M plus einige weitere Anforderung, fügt bis zu 1.1M [auch in diesem Fall wget von test.php zeigt das gleiche Verhalten wie oben], während Firefox Firebug zeigt, dass die Anforderung zwischen 140K-300K [noch nicht alle Inhalte angezeigt.

0voto

Karoly Horvath Punkte 91548

Siehe http://www.php.net/manual/en/function.readfile.php und suchen Sie nach: groß. Kopieren und Einfügen des Codes :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X