2009-08-26 6 views
2

mettre un en-tête de la façon suivante:tête Content-Length toujours zéro

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, un Solaris avec Apache et PHP compilé, j'obtiens un fichier avec la taille du fichier égale à zéro, donc un fichier vide.

Existe-t-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 donc être quelque chose dans le cadre sanglant. Je voudrais jeter tout le CMS loin. Etes-vous sûr que le fichier existe sur le serveur de production?

Répondre

4

Vérifiez l'en-tête de codage de transfert.Si le codage de transfert est morcelées, le champ Content-Length ne sera pas mis

Les causes possibles, est que ZendServer ne fait pas le codage chunked, alors que Apache ne

Voir les liens ci-dessous pour plus de détails

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

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

+0

Merci! Je reçois: Transfer-Encoding: chunked et pas de 'Content-Length' Je devrais trouver un moyen d'arrêter le serveur pour faire cela. – rtacconi

+0

Peut-être, bien que n'étant pas sûr, le framework Zend détermine s'il faut utiliser l'encodage en segments ou non. Besoin de vérifier la documentation – Ram

+0

ok, merci beaucoup – rtacconi

0

Peut-être que c'est un problème de sensibilité à la casse (par exemple, "Fichier" et "fichier" sont les mêmes sur Windows, mais différent sur UNIX)? L'utilisateur exécutant Apache/PHP a-t-il un accès en lecture?

2

Assurez-vous que le fichier existe réellement sous le chemin spécifié (is_file vérifie à la fois l'existence et si le fichier est un fichier normal) et est lisible (is_readable) avant de l'envoyer au client. filesize renvoie false si une erreur est survenue. Cela peut donc être la cause de votre valeur 0 ou de la valeur vide pour Content-Length.

Et, comme Ferdinand Beyer already mentioned, assurez-vous que votre script est portable et peut gérer des environnements différents.

+0

Il est pas un problème de permissions, je teste un fichier avec 777. Il est pas un problème de nom de fichier. Le fichier existe et n'a pas la taille de fichier 0. Je peux le télécharger en mettant l'URI dans le navigateur, mais le script resta toujours 0. – rtacconi

+0

@rtacconi: Avez-vous vérifié l'en-tête HTTP brut de la réponse? – Gumbo

+0

Non, j'ai pensé à le vérifier mais je devrais trouver un tutoriel sur HTTP pour le commentaire à utiliser dans le telnet – rtacconi

0

Avez-vous des erreurs si vous activez les erreurs?

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

Non, je n'ai aucune erreur. – rtacconi

0

A p roblè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 .htaccess RewriteRule pour désactiver gzip:

RewriteRule . - [E=no-gzip:1] 
Questions connexes