tête Content-Length zéro toujours
-
20-09-2019 - |
Question
Je mis un en-tête de la manière suivante:
header('Content-Length: ' . filesize($strPath));
Sur mon PC avec ZendServer il fonctionne très bien et je peux télécharger un fichier avec la taille de fichier correct. Sur le serveur de production, Solaris avec Apache et PHP compilé, je reçois un fichier avec la taille du fichier égal à zéro, un fichier vide.
Y at-il un paramètre de configuration? Quelque chose qui peut empêcher de définir «Content-Length: 1222?
Merci.
Le 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');
}
?>
Quand je commente le code avant $ strPath cela fonctionne, il doit être quelque chose dans le cadre sanglant. Je voudrais jeter toute la CMS.
La solution
Vérifiez en-tête de transfert codant. Si le codage de transfert est morcelées, le champ Content-Length ne sera pas réglée
Les causes possibles, est que ZendServer ne fait pas morcelées encodage, alors que Apache fait
Voir les liens ci-dessous pour plus de détails
Autres conseils
Assurez-vous que le fichier existe réellement dans le chemin d'accès spécifié ( is_file
vérifie à la fois et si l'existance le fichier est un fichier régulier) et est lisible ( is_readable
) avant de l'envoyer au client. filesize
retourne false si une erreur survient. Alors, qui pourrait être la cause de votre valeur 0 ou valeur vide pour Content-Length .
Et, comme Ferdinand Beyer déjà mentionné , faire vous que votre script est portable et peut gérer différents environnements.
Êtes-vous sûr que le fichier existe sur le serveur de production? Peut-être qu'il est un cas problème de sensibilité (par exemple, « Fichier » et « fichier » sont les mêmes sous Windows, mais différents sous UNIX)? Est-ce que l'utilisateur exécutant Apache / PHP ont un accès en lecture?
Avez-vous des erreurs si vous activez des erreurs?
error_reporting(E_ALL);
ini_set('display_errors', '1');
Un problème peut être que Apache est gzipping téléchargement, en prenant soin de corriger le Content-Length, ou dans votre cas, la suppression de cette tête et en ajoutant
Content-Encoding: chunked
Vous pouvez ajouter un RewriteRule de .htaccess
désactiver gzip:
RewriteRule . - [E=no-gzip:1]