cabecera Content-Length siempre cero
-
20-09-2019 - |
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.
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
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]