Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
safer-print
Threadersteller
Dabei seit: 11.03.2010
Ort: -
Alter: -
Geschlecht:
|
Verfasst Di 13.04.2010 20:54
Titel [PHP] header("Content-Length: XX") Problem bei Fir |
|
|
Ich möchte einen Download zur Verfügung stellen und verwende folgenden Code:
Code: | header('Pragma: no-cache');
header("Content-Transfer-Encoding: binary\n");
header('Content-Description: File Transfer');
header('Content-type: application/zip');
header("Content-Length: ".(string) filesize($filename));
header("Content-Disposition: attachment; filename=$temp.zip");
echo file_get_contents($filename);
die;
|
Bei manchen Dateigrößen (z.B. 3942443 Bytes gehen nicht / 3784141 Bytes gehen) wird der Download am Ende um wenige hundert Byte abgeschnitten. Wenn ich die Zeile 'header("Content-Length: ...' auskommentiere, funktioniert es immer. Nur weiß der Browser dann nicht wie viel Daten noch kommen und kann keinen sinnvollen Fortschrittsbalken anzeigen.
Jemand einen Tipp?
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Di 13.04.2010 21:25
Titel
|
|
|
Der Fehler ist beim kurzen Überfliegen des Codes direkt nicht nachzuvollziehen. Einige potenzielle Fehlerquellen könnten sein:
1.) Der Status Cache, den filesize() benutzt
2.) file_get_contents() macht irgend einen Mist mit Deinen Binärdaten, vorzugsweise unter Windows. *nixe unterscheiden nicht zwischen Text- und/oder Binärdateien.
3.) Ein Memory Limit?
file_get_contents() würde ich sowieso nicht benutzen. Schlimm genug, dass PHP die Datei durchschleifen muss, man muss nicht auch gleich ein PHP-Symbol mit dem Datei-Inhalt vermüllen. Ich würde der Funktion nicht über den Weg trauen, wenn ich mit Binärdaten herumhampele.
Vielleicht ist fpassthru() in Verbindung mit (fopen() fpassthru() fclose()) die bessere Alternative? Wenn du lieber OOP machst, dann nimm die SPL-Filewrapper und verwende SPLFileInfo->openFile() um einen Stream-Pointer zu erhalten.
fpassthru() kann den Stream direkt in den Ausgabepuffer umleiten. Ohne das getestet zu haben, würde ich wetten, dass das performanter ist. fopen() bekommt sicherheitshalber den "b"-Hinweis, um auch unter Windows das gewisse Maß an Sicherheit zu haben.
Noch besser ist die Verwendung von mod_xsendfile
|
|
|
|
|
Anzeige
|
|
|
safer-print
Threadersteller
Dabei seit: 11.03.2010
Ort: -
Alter: -
Geschlecht:
|
Verfasst Di 13.04.2010 22:25
Titel [PHP] header("Content-Length: XX") Problem > ge |
|
|
Das spannende ist, das die Daten binärkompatibel sind, eben bis auf die letzten 200 Byte, die fehlen, wenn die Länge korrekt im Header angegeben wird. Ich habe auch die Länge geprüft im Dateisystem des Servers und die Ausgabe des Skripts.
Wie auch immer der Tipp mod_xsendfile löst das Problem, danke beacon. Ich will kurz beschrieben wie ich das installiert habe, weil das nicht ganz so trivial ist und der Thread dann auch in Zukunft eine Hilfe sein kann (System ist Debian Lenny):
Code: | #apt-get install apache2-prefork-dev // apxs (APache eXtenSion) installieren
#cd /tmp
#wget http://tn123.ath.cx/mod_xsendfile/mod_xsendfile.c // Quellen holen
#/usr/bin/apxs2 -cia /tmp/mod_xsendfile.c // und installieren
|
Dann die Konfigurationsdatei unter /etc/apache2/mods-available/mod_xsendfile.load erstellen:
Code: | LoadModule xsendfile_module /usr/lib/apache2/modules/mod_xsendfile.so
<Files *.php>
XSendFile on
XSendFileAllowAbove on
</Files> |
Apache neustarten
Code: | /etc/init.d/apache2 restart |
und in die PHP-Datei folgende Header einfügen:
Code: | header("X-Sendfile: $somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; file=\"$somefile\"");
exit; |
Zuletzt bearbeitet von safer-print am Di 13.04.2010 22:34, insgesamt 1-mal bearbeitet
|
|
|
|
|
|
|
|
Ähnliche Themen |
CSS Problem Header feste Höhe, Content Fensterfüllend?
[CSS] Layout(Header, Sidenav, Content, Footer) mit 100% Höhe
Variabler Header/Footer in Höhe - fester Content - WIE?
PHP Menü/Navi nicht unter header sondern unter content?
CSS / Seite mit Header - Content - Footer / height="100%" ?
Header Problem !
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|