2010-07-18 5 views
1

J'ai un script php que j'ai utilisé pendant des années pour forcer les téléchargements de mon site Web. Mais au cours du dernier mois, il a cessé de fonctionner et déclenche des erreurs de fichier non trouvées. La chose étrange est que dans Firefox, si je vois la source sur la page d'erreur, c'est le fichier que j'essayais de télécharger. Et faire Fichier> Enregistrer à partir de là vous donne le bon fichier. Donc, je sais que ce n'est pas un problème avec le script ne trouvant pas le fichier sur le serveur.Le téléchargement forcé a cessé de fonctionner

Y a-t-il un problème avec la façon dont je configure les en-têtes?

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header('Content-Type: application/octet-stream'); 
header('Content-Transfer-Encoding: Binary'); 
header('Content-length: '.filesize($file_url)); 
header('Content-disposition: attachment; filename="'.basename($file_url).'"'); 
readfile($file_url); 
+0

WHAT est la valeur de $ file_url? – Artefacto

+0

C'est le chemin vers le fichier à télécharger. Ce que j'ai posté est juste le code utilisé pour déclencher le téléchargement. Je sais que la première pensée sera que le chemin est faux, mais ce n'est pas comme source de vue et sauver produire le bon fichier. – unholysampler

Répondre

0

J'ai fini par tricher pour que cela fonctionne.

header("Location: $file_url"); //file_url is now the real url, not the path 

Et puis utilisé cPanel pour vous assurer que tous les types MIME que j'utilisais ont été mis à application/octet-stream.

1

Pouvez-vous essayer cette fonction?

function force_download($file){ 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    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($file)); 
    readfile($file); 
    exit; 
} 
+0

Désolé, le résultat est identique. – unholysampler

+1

Un peu hors-sujet, qu'est-ce qui se passe avec tout le monde en ajoutant post-check = 0 et pre-check = 0 quand ils veulent servir des fichiers? C'est une de ces choses qui ne fait vraiment rien, et obtient juste copié-collé ... https://blogs.msdn.com/b/ie/archive/2006/06/01/613132.aspx – kander

+0

@unholysampler - Utilisez-vous Chrome Browser parce que j'ai vu le même bug dans le chrome. Il ne parvient pas à afficher les en-têtes. – Shubham

Questions connexes