Pregunta

establecer una cabecera de la siguiente manera:

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

En mi PC con ZendServer funciona bien y que puede descargar un archivo con el tamaño de archivo correcto. En el servidor de producción, un Solaris con Apache y PHP compilado, aparece un archivo con el tamaño del archivo es igual a cero, por lo que un archivo vacío.

¿Hay un parámetro de configuración? Algo que puede evitar que establece 'Content-Length: 1222'?

Gracias.

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

Cuando comento el código antes $ strPath funciona, por lo que debe haber algo en el marco sangrienta. Me gustaría tirar todo el CMS de distancia.

¿Fue útil?

Solución

Comprobar cabecera transferencia de codificación. Si está fragmentada la codificación de transferencia, entonces el campo Content-Length no se establecerá

Las posibles causas, es que no hace ZendServer fragmentada codificación, mientras que Apache hace

Vea los siguientes enlaces para obtener más información

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

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

Otros consejos

Asegúrese de que el archivo realmente existe en la ruta especificada ( is_file comprueba tanto la existencia y si el archivo es un archivo normal) y es legible ( is_readable ) antes de enviarlo al cliente. filesize Devuelve false si ocurre un error. Lo que podría ser la causa de su valor de 0 o un valor vacío para Content-Length .

Y, como Ferdinand Beyer ya se ha mencionado , hacer Asegúrese de que su guión es portátil y puede manejar diferentes ambientes.

¿Está seguro el archivo existe en el servidor de producción? Tal vez sea una cuestión de mayúsculas y minúsculas (por ejemplo, "Archivo" y "archivo" son los mismos en Windows, pero diferente en UNIX)? ¿El usuario que ejecuta Apache / PHP tener acceso de lectura?

¿Le da ningún error si se habilita errores?

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

Un problema puede ser que Apache se gzipping El proceso de descarga, el cuidado de la corrección de la longitud del contenido, o en su caso, la eliminación de esa cabecera y añadiendo

  

Content-Encoding: fragmentada

Se puede añadir un RewriteRule .htaccess desactivar gzip:

RewriteRule . - [E=no-gzip:1]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top