Content-length-header nicht korrekt gesetzt
Ich habe ein php-Skript (eigentlich https://drupal.org/project/file_force), die den Benutzer zwingen, klicken Sie auf einen link den download-link, indem die korrekten Header an die response.
Dieser link funktioniert 90% der Zeit. Gelegentlich wird der falsche content-length übergeben wird, damit die Benutzer werden immer scheinbar abgeschnitten-Dateien. Der Fehler wiederholt sich konsequent auf bestimmte Dateien, aber wenn diese Dateien neu hochgeladen, der Fehler kann nicht angezeigt werden auf die neue Instanz, die macht mich denken, dass dies nicht ein Problem mit den Dateien, sondern stattdessen ein cache irgendwo. Also lief ich clearstatcache() jedes mal ohne Erfolg. Was ist merkwürdig ist, dass php die übergabe des richtigen Datei-Größe, oder sagt, es ist, wenn ich übergeben Sie die Zeichenfolge es ist das einfügen in eine log-Datei.
Hier ist der relevante code:
clearstatcache();
return array(
'Content-Type: ' . $mimeinfo,
'Content-Disposition: ' . $disposition . '; filename="' . basename($filepath) . '";',
//Content-Length is also a good header to send, as it allows the browser to
//display a progress bar correctly.
//There's a trick for determining the file size for files over 2 GB. Nobody
//should be using this module with files that large, but… the sprintf()
//trickery makes sure the value is correct for files larger than 2GB. See
//note at http://php.net/filesize
'Content-Length: ' . sprintf('%u', filesize($filepath)),
);
Ein Beispiel für die Ausgabe von sprintf('%u', filesize($filepath)) auf eine Datei, die nicht funktioniert, ist 2682059
die irgendwie übersetzt wird, zu 1740048
wenn der browser zu sehen bekommt, es.
Ich habe versucht, das entfernen der sprintf-Funktion ohne Erfolg.
Ich habe auch versucht, dass Sie keinen Content-Length-Erklärung bei allen, aber jemand ist immer angebracht, mit der falsche Wert trotzdem. Das Letzte Stück der Beweise, die vielleicht schlägt manchen anderen code überschreiben, der content-Header bin ich hier, aber es zu lassen scheint allein anderen Headern, die ich ändern in den obigen code zu testen, dass die Theorie.
Irgendwelche Gedanken an, wo Sie zu suchen?
- Haben Sie versucht, mit der überprüfung die Größe der Datei, die Sie mit filesize($filepath)?
- Jup, die erste Zahl (2682059) ist das, was
filesize($filepath)
Retouren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich das Problem gelöst.
Stellt sich heraus, ein weiteres Modul innerhalb von Drupal war das hinzufügen von eigenen content-length-header und immer den Wert aus einer Datenbank, anstatt die Datei direkt (seltsam), und es war geschehen herab. Durch die Umkehrung der Reihenfolge, in der Module bekam Ihre Hände auf den Header, das Problem ging Weg. Ich habe einen bug-report eingereicht, der gegen die Verfügungen Modul.
QUELLEN: PHP-offizielle Dokumentation - "header" - Funktion
Gibt es eine Funktion in PHP, dem sogenannten header, die Sie verwenden möchten, um Header zu setzen, bevor die eigentliche Seite geladen:
Hier ist das Skelett der Funktion:
Erklärung:
Parameter:
===
Rückgabewerte:
Kein Wert zurückgegeben wird.
Beispiel:
Hinweis: Die Funktion muss aufgerufen werden, bevor eine Ausgabe gesendet, D. H. bevor alle HTML-tags oder vor jeder echo Anrufe.
in Ihrem Fall:
dem replace-parameter ist per default true, wird dazu führen, das Programm überschreibt alle vorher gesetzten 'Content-Length' Header..
Hoffe die Erklärung war es Wert... 🙂