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
Vous devez vous connecter pour publier un commentaire.
Qui semble attribuer de code juste à la force de téléchargement, voici une belle fonction que j'utilise tout le temps. Il va gérer les fichiers de plus de 2GB.
quelle terrible modifier, la honte de la communauté pour approbation
Ce qui est si terrible au sujet de faire le code du travail? Le code a eu un manque
)
. Pensez-vous qu'il est préférable de laisser le code avec les fautes de frappe? Le manque)
pourrait confondre les gens et perdent beaucoup de leur temps.Belle place sur le
(is_dir($path))
mais le reste de l'édition, a été tout simplement personnels de la syntaxe de préférence.Il ne serait pas permettez-moi simplement d'ajouter le manque
)
parce qu'il y a un montant minimum de personnages que j'ai modifier. Je suppose que je pourrais avoir entré une courte phrase en bas à la place.OriginalL'auteur Lawrence Cherone
Très agréable, utile aussi...
mais il y a un problème dans votre code -
veuillez le changer avec cette suite de
vous avez oublié de le fermer.
OriginalL'auteur Ahsanul Kabir
OriginalL'auteur Altair CA
Votre script peut contenir des AVIS ou AVERTISSEMENT, essayez de désactiver les rapports d'erreurs sur le haut de votre script:
OriginalL'auteur Superbiji
Assurez-vous que vous n'avez aucun code exécuté après la dernière ligne
readfile(FILE_NAME)
J'ai dû ajouter
die();
ouexit();
comme la dernière ligne, car framework MVC continue de rendre la vue aprèsreadfile
OriginalL'auteur AamirR