mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 25.04.2024 01:25 Benutzername: Passwort: Auto-Login

Thema: [PHP] header("Content-Length: XX") Problem bei Firefox vom 13.04.2010


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [PHP] header("Content-Length: XX") Problem bei Firefox
Autor Nachricht
safer-print
Threadersteller

Dabei seit: 11.03.2010
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Di 13.04.2010 20:54
Titel

[PHP] header("Content-Length: XX") Problem bei Fir

Antworten mit Zitat Zum Seitenanfang

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?
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 13.04.2010 21:25
Titel

Antworten mit Zitat Zum Seitenanfang

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
  View user's profile Private Nachricht senden
Anzeige
Anzeige
safer-print
Threadersteller

Dabei seit: 11.03.2010
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Di 13.04.2010 22:25
Titel

[PHP] header("Content-Length: XX") Problem > ge

Antworten mit Zitat Zum Seitenanfang

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
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ä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 !
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.