web-dev-qa-db-fra.com

Est-il possible de rediriger après avoir "poussé" un fichier vers l'utilisateur?

J'ai une configuration où un site génère des analyses internes sur l'utilisation du site. Les utilisateurs peuvent demander le téléchargement de leurs analyses personnelles, et parce que ces informations sont sensibles, je ne crée aucun fichier, je génère un fichier CSV dans une variable, puis je le "pousse" vers l'utilisateur avec ceci:

function _cex_download( $output, $filename ) 
{
  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: private");
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$filename");
  header("Accept-Ranges: bytes");
  echo $output;
  exit;
}

Cela provoque le navigateur de l'utilisateur pour ouvrir une boîte de dialogue "enregistrer le fichier", et l'utilisateur obtient le fichier créé de leur côté. Cela fonctionne très bien, sauf que les administrateurs du site sont capables de déclencher des "exportations destructrices" - et dans cette situation, j'ai un formulaire de confirmation secondaire que l'administrateur doit accepter avant que l'exportation destructive ne s'exécute.

Le problème est que cette routine de "téléchargement push" met fin au traitement de la page Drupal. Il ne semble pas possible de rediriger l'administrateur vers une page après l'appel de cette routine de téléchargement push. Les administrateurs obtiennent un ' la boîte de dialogue d'enregistrement du fichier est apparue par leur navigateur, mais ils restent sur le formulaire de confirmation.

J'ai essayé d'emprunter la route des formulaires en plusieurs étapes, mais après une journée à fouiller avec d'étranges redirections, j'ai renoncé à cette confusion. Nous avons également commencé à examiner la logique de formulaire en plusieurs étapes de ChaosTool. Mais quelque chose me dit que le problème est vraiment que ce "téléchargement push" est un tueur de processus guidé.

Peut-être une boîte de dialogue de confirmation jquery qui intercepte le clic initial du bouton `` Exporter '', faire la confirmation entièrement en javascript, oublier d'avoir un formulaire de confirmation php/FAPI, et lorsque l'utilisateur confirme dans jquery, je soumets par programme l'exportation que j'ai interceptée?

7
Blake Senftner

Il semble y avoir quelques astuces, aucune idée de leur bon fonctionnement à l'intérieur de Drupal.

Voir par exemple http://www.willmaster.com/blog/automation/one-link-download-and-redirect.php

2
Berdir

Pour autant que je sache, ce n'est pas possible. Vous pouvez soit envoyer du contenu (dans votre cas, un fichier), soit rediriger. Pas les deux. Ceci est une limitation du protocole HTTP

3
Fuzzy76

Je pense que votre meilleur pari pourrait être de générer un jeton lorsque l'utilisateur soumet le formulaire, puis que le jeton stocke toutes les informations nécessaires pour générer le fichier CSV. Demandez au formulaire de rediriger l'utilisateur vers la page appropriée et utilisez drupal_set_message () pour fournir un lien qui contient le jeton.

Lorsque le lien est cliqué, le fichier CSV peut être généré et envoyé à l'utilisateur à ce moment. Certes, c'est plus compliqué que de simplement le générer sur le formulaire soumis, mais comme le dit Fuzzy76, vous êtes confronté à une limitation du protocole HTTP. Le faire de cette façon pourrait être plus simple que d'essayer de créer une solution basée sur JavaScript.

2
Chris Cohen

Voici comment je l'ai atteint en Drupal via Jquery/JS My Answere here -> Je l'ai atteint via JS, Fine my answer here -> https://stackoverflow.com/ questions/822707/php-generate-file-for-download-then-redirect/25843144 # 25843144

0
Vaibhav Jain