Pourquoi mon fichier téléchargé est toujours endommagé ou corrompu?

J'ai un problème bizarre avec mon téléchargement script

fondamentalement

1.obtient un id de fichier avec la méthode "GET"

2.obtient le nom et l'emplacement du fichier de base de données

3.l'envoie au client avec les en-têtes et readfile

mais étrangement, ce fichier s'en sort toujours comme corrompu ou endommagé

comme si c'est un fichier zip ou rar
la taille du fichier est de droite et qu'il ouvre ok

mais je ne peux pas ouvrir des fichiers compressés à l'intérieur de cela et c'est quand je reçois le fichier endommagé erreur

qui est bizarre parce que si le code a un problème, je ne devrais même pas être en mesure d'ouvrir le fichier zip(ou, au moins, je pense que je ne devrais pas)

une autre chose est que j'ai l'impression du fichier avec son chemin à droite avant d'envoyer les en-têtes juste pour être sûr que tout est ok

J'ai mis l'adresse du fichier sur le web et de télécharger le fichier , le fichier était ok avec aucune erreur

donc tout va bien avant d'envoyer les en-têtes

voici mon code

        $file_id = isset($_GET['id']) && (int)$_GET['id'] != 0 ? (int)$_GET['id'] : exit;
////////finging file info
$file = comon::get_all_by_condition('files' , 'id' , $file_id );
if(!$file) exit;
foreach($file as $file){
$location = $file['location'];
$filename = $file['file_name'];
}
/////////////
$site = comon::get_site_domian();
$ext = trim(end(explode('.' , $filename )));
$abslout_path = 'http://'.$site.'/'.$location.'/'.$filename;
$relative = $location.'/'.$filename;
//////////////////content type 
switch($ext) {
case 'txt':
$cType = 'text/plain'; 
break;              
case 'pdf':
$cType = 'application/pdf'; 
break;
case 'zip':
$cType = 'application/zip';
break;
case 'doc':
$cType = 'application/msword';
break;
case 'xls':
$cType = 'application/vnd.ms-excel';
break;
case 'ppt':
$cType = 'application/vnd.ms-powerpoint';
break;
case 'gif':
$cType = 'image/gif';
break;
case 'png':
$cType = 'image/png';
break;
case 'jpeg':
case 'jpg':
$cType = 'image/jpg';
break;
default:
$cType = 'application/force-download';
break;
}
////////////////just checking 
if(!file_exists($relative)){
echo $relative;
echo '<br />';
exit;
}
if( !is_readable( $relative ) )
exit('its not redable');
if( headers_sent() )
exit('headers ? already sent !! ');
header( 'Pragma: public' ); 
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Cache-Control: private', false ); //required for certain browsers 
header( 'Content-Description:File Transfer' );
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header( 'Content-Type:'.$cType);
header( 'Content-Disposition: attachment; filename="'. basename($filename) . '";' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Length: ' . filesize($relative) );
readfile($abslout_path);
exit;

J'ai vérifié les en-têtes ou deux fois et ils sont très bien(je pense) , j'ai également ajouter les en-têtes connues de l'homme juste pour être sûr !

Je commence à penser que c'est peut-être autre chose que le script
comme l'encodage ou le dossier d'autorisation ! ou quelque chose comme ça !!

suis-je raté quelque chose ?

OriginalL'auteur max | 2012-04-13