Domanda

Ho impostato un colpo di testa nel seguente modo:

header('Content-Length: ' . filesize($strPath));

Sul mio PC con ZendServer funziona benissimo e posso scaricare un file con la dimensione del file corretto. Sul server di produzione, un Solaris con Apache e PHP compilato, ho un file con la dimensione del file uguale a zero, quindi un file vuoto.

C'è un parametro di configurazione? Qualcosa che può impedire di impostare 'Content-Length: 1222'?

Grazie.

Il codice:

<?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');
}   
?>

Quando ho commentare il codice prima di $ strPath funziona, quindi deve essere qualcosa nel quadro sanguinosa. Vorrei buttare tutto via CMS.

È stato utile?

Soluzione

Controlla intestazione Transfer-Encoding. Se la codifica di trasferimento è Chunked allora il campo Content-Length non verrà impostato

Possibili cause, è che ZendServer non fa chunked codifica, mentre Apache fa

Vedere i seguenti link per i dettagli

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

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

Altri suggerimenti

Assicurarsi che il file esista davvero sotto il percorso specificato ( is_file controlli sia l'esistenza e se il file è un file normale) ed è leggibile ( is_readable ) prima di inviarlo al client. filesize rendimenti false in caso di errore. Quindi, che potrebbe essere il motivo del vostro il valore 0 o un valore vuoto per Content-Length .

E, come Ferdinand Beyer già accennato , fare assicurarsi che lo script è portatile e può gestire diversi ambienti.

Sei sicuro che il file esiste sul server di produzione? Forse è un problema di sensibilità caso (per esempio, "File" e "file" sono gli stessi su Windows, ma diverso su UNIX)? Ha l'utente che esegue Apache / PHP avere accesso in lettura?

Non si ottiene errori se si attiva errori?

error_reporting(E_ALL);
ini_set('display_errors', '1');

Un problema potrebbe essere che Apache è gzipping il download, avendo cura di correggere il Content-Length, o nel tuo caso, rimuovendo tale intestazione e l'aggiunta di

  

Content-Encoding: chunked

È possibile aggiungere una RewriteRule .htaccess per disabilitare gzip:

RewriteRule . - [E=no-gzip:1]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top