Content-Length-Header immer Null
-
20-09-2019 - |
Frage
Ich habe einen Header auf folgende Weise:
header('Content-Length: ' . filesize($strPath));
Auf meinem PC mit ZendServer es funktioniert gut und ich kann eine Datei mit der richtigen Dateigröße herunterladen. Auf dem Produktionsserver ein Solaris mit Apache und PHP kompiliert, erhalte ich eine Datei mit der Dateigröße gleich Null ist, so eine leere Datei.
Gibt es einen Konfigurationsparameter? Etwas, das Set verhindern 'Content-Length: 1222'?
Danke.
Der Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
require 'includes/prepend.inc.php';
require __ADMIN_DIR__.'/AdminInfo.php';
$intFile = QApplication::QueryString('fileID');
if($intFile == '') die('Error: missing ID');
$objFile = File::Load($intFile);
$blnRight = false;
$objAdminInfo = new AdminInfo();
if($objAdminInfo->isAdmin()) {
$blnRight = true;
}
else {
$objSecMan = new SecurityManager(
'file:'.$objFile->FileID,
$objAdminInfo->getUserID()
);
$blnRight = $objSecMan->processResource('view');
}
// if the user can modify and or publish, can even view the file
if(!$blnRight) {
$blnRight = $objSecMan->processResource('modify');
if(!$blnRight) {
$blnRight = $objSecMan->processResource('publish');
}
}
//$strPath = __UPLOADS__.DIRECTORY_SEPARATOR.$objFile->FileID;
$strPath = 'subdept.csv';
if (file_exists($strPath) && $blnRight) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$strPath);//$objFile->Filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($strPath));
ob_clean();
flush();
readfile($strPath);
exit;
}
else {
die('Restricted access');
}
?>
Wenn ich den Code vor $ strPath Kommentar es funktioniert, so muss es etwas in dem blutigen Rahmen sein. Ich möchte weg die ganze CMS werfen.
Lösung
Nach Transfer-Encoding-Header. Wenn die Übertragungscodierung gestückelt wird, dann wird das Content-Length-Feld nicht gesetzt werden
Mögliche Ursachen, ist, dass ZendServer nicht Codierung chunked tun, während Apache funktioniert
Sehen Sie die folgenden Links für weitere Details
Andere Tipps
Vergewissern Sie sich, dass die Datei vorhanden ist unter Pfad wirklich dem angegebenen ( is_file
prüft sowohl die Existenz und wenn die Datei ist eine reguläre Datei) und lesbar ist ( is_readable
), bevor sie an den Client gesendet. filesize
kehrt false , wenn ein Fehler aufgetreten ist. So, dass die Ursache für Ihren Wert 0 oder leeren Wert für Content-Length sein.
Und wie Ferdinand Beyer bereits erwähnt , make Sie sicher, dass Ihr Skript ist tragbar und kann verschiedene Umgebungen verarbeiten.
Sind Sie sicher, dass die Datei auf dem Produktions-Server vorhanden ist? Vielleicht ist es eine Fall Empfindlichkeit Ausgabe (beispielsweise „Datei“ und „Datei“ wird die gleiche auf Windows, aber anders auf UNIX)? Hat der Benutzer Apache / PHP ausgeführt hat Lesezugriff?
Sie erhalten Sie Fehler, wenn Sie Fehler aktivieren?
error_reporting(E_ALL);
ini_set('display_errors', '1');
Ein Problem kann sein, dass Apache der Download ist Gzipping, kümmert sich die Content-Length zu korrigieren, oder in Ihrem Fall zu entfernen, die Header und das Hinzufügen
Content-Encoding: Chunked
Sie können eine .htaccess
RewriteRule zu deaktivieren gzip hinzufügen:
RewriteRule . - [E=no-gzip:1]