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.

War es hilfreich?

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

http://en.wikipedia.org/wiki/Chunked_transfer_encoding

http://www.w3.org/Protocols/rfc2616/rfc2616 -sec3.html

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top