68 votes

PHP génère un fichier à télécharger puis le redirige

J'ai une application PHP qui crée un fichier CSV dont le téléchargement est forcé par les en-têtes. Voici la partie pertinente du code :

header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content;
exit();

Ce que j'aimerais faire, c'est rediriger les utilisateurs vers une nouvelle page après la création du fichier et l'envoi de l'invite de téléchargement. Il suffit d'ajouter header("Location: /newpage") à la fin n'a pas fonctionné, comme on pouvait s'y attendre, donc je ne suis pas sûr de la façon dont il faut procéder.

92voto

daremon Points 3171

Je ne pense pas que cela soit possible - bien que je ne sois pas sûr à 100%.

Le plus souvent (par exemple sur les sites de téléchargement populaires), c'est l'inverse : vous allez d'abord sur la page "après", puis le téléchargement commence.

Redirigez donc vos utilisateurs vers la page "finale" qui dit (entre autres choses) :

Votre téléchargement devrait démarrer automatiquement. Sinon, cliquez [a href="create_csv.php"]ici[/a].

En ce qui concerne le déclenchement du téléchargement (par exemple, en appelant automatiquement create_csv.php), vous avez de nombreuses possibilités :

15voto

simon Points 1621

très facile à faire dans le cas où cela est vraiment nécessaire.

Mais vous devrez avoir un peu de travail en JavaScript et en cookies :

en PHP, vous devez ajouter la mise en place d'un cookie

header('Set-Cookie: fileLoading=true'); 

puis sur la page où vous appelez le téléchargement, vous devriez suivre avec JS (par exemple une fois par seconde) s'il y a un cookie à venir comme ça (il est utilisé plugin Cookie jQuery ici) :

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

Maintenant, si le fichier commence à être téléchargé, JS le reconnaît et redirige vers la page nécessaire après la suppression du cookie.

Bien sûr, vous pouvez dire à votre navigateur qu'il doit accepter les cookies, le JavaScript et ainsi de suite, mais cela fonctionne.

10voto

Ólafur Waage Points 40104

Les en-têtes que vous envoyez sont des en-têtes HTTP. Le navigateur prend cela comme une demande de page et le traite comme une page. Et dans votre cas, une page qu'il doit télécharger.

L'ajout d'un en-tête de redirection perturbe donc l'ensemble du processus de téléchargement du fichier (étant donné que les en-têtes sont collectés, générés en un seul en-tête puis envoyés au navigateur, vous pouvez essayer d'y remédier en définissant plusieurs en-têtes de redirection IIRC).

3voto

martar Points 21

N'oubliez pas, cependant, que le lancement automatique des fichiers téléchargeables pour les utilisateurs d'IE déclenchera l'onglet d'avertissement de sécurité. Les trois méthodes décrites par daremon font apparaître cet avertissement. Vous ne pouvez tout simplement pas contourner ce problème. Vous serez mieux servi si vous fournissez de vrais liens.

2voto

Darren Crabb Points 11

J'ai trouvé une solution de contournement qui repose sur le javascript, donc pas vraiment sécurisée, mais pour les sites critiques non sécurisés, elle semble fonctionner.

Ayez un formulaire avec un bouton intitulé 'download' avec l'action définie pour pointer vers le script de téléchargement, puis en utilisant javascript mettez quelque chose sur le handler onsubmit qui enlève le bouton de téléchargement et remplace le message sur l'écran. Le téléchargement devrait quand même avoir lieu et l'écran changer. Évidemment, s'il y a un problème avec le téléchargement script alors il semble toujours que le téléchargement a réussi même s'il ne se déclenche pas, mais c'est le mieux que j'ai pour le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X