Pergunta

Eu defino um cabeçalho da seguinte maneira:

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

No meu PC com o ZendServer, ele funciona bem e posso baixar um arquivo com o tamanho correto do arquivo. No servidor de produção, um Solaris com Apache e PHP compilado, recebo um arquivo com o tamanho do arquivo igual a zero, portanto, um arquivo vazio.

Existe um parâmetro de configuração? Algo que pode evitar definir o 'comprimento de conteúdo: 1222'?

Obrigado.

O código:

<?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 eu comento o código antes de $ strpath, ele funciona, por isso deve ser algo na estrutura sangrenta. Eu gostaria de jogar o CMS inteiro fora.

Foi útil?

Solução

Verifique o cabeçalho de codificação de transferência. Se a codificação de transferência for cortada, o campo de comprimento de conteúdo não será definido

Possíveis causas, é que o ZendServer não faz codificação em chunked, enquanto o Apache faz

Veja os seguintes links para obter detalhes

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

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

Outras dicas

Verifique se o arquivo realmente existe no caminho especificado (is_file verifica a existência e se o arquivo for um arquivo regular) e for legível (is_readable) antes de enviá -lo para o cliente. filesize retorna falso Se ocorreu um erro. Portanto, essa pode ser a causa do seu valor 0 ou valor vazio para Comprimento do conteúdo.

E como Ferdinand Beyer já mencionado, verifique se o seu script é portátil e pode lidar com diferentes ambientes.

Tem certeza de que o arquivo existe no servidor de produção? Talvez seja um problema de sensibilidade ao caso (por exemplo, "arquivo" e "arquivo" são os mesmos no Windows, mas diferentes no Unix)? O usuário executando o Apache/PHP tem acesso a leitura?

Você recebe algum erro se ativar erros?

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

Um problema pode ser que o Apache esteja girando seu download, cuidando de corrigir o comprimento do conteúdo ou, no seu caso, remover esse cabeçalho e adicionar

Codificação de conteúdo: rasgo

Você pode adicionar um .htaccess Rewriture para desativar o GZIP:

RewriteRule . - [E=no-gzip:1]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top