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.

Était-ce utile?

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

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

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

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top