Ist es möglich, umzuleiten, nachdem eine Datei an den Benutzer gesendet wurde?

7

Ich habe ein Setup, bei dem eine Site interne Analysen zur Site-Nutzung generiert. Benutzer können einen Download ihrer persönlichen Analysen anfordern. Da diese Informationen vertraulich sind, erstelle ich keine Dateien. Ich generiere eine CSV-Datei in einer Variablen und "schiebe" sie dann an den Benutzer:

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;
}

Dies führt dazu, dass der Browser des Benutzers ein Dialogfeld "Datei speichern" öffnet und der Benutzer die Datei am Ende erstellt. Dies funktioniert einwandfrei, außer dass die Administratoren der Site "destruktive Exporte" auslösen können - und in dieser Situation habe ich ein sekundäres Bestätigungsformular, das der Administrator akzeptieren muss, bevor der destruktive Export ausgeführt wird.

Das Problem ist, dass diese "Push-Download" -Routine die Drupal-Seitenverarbeitung beendet. Es scheint keine Möglichkeit zu geben, den Administrator auf eine Seite umzuleiten, nachdem diese Push-Download-Routine aufgerufen wurde. Administratoren erhalten von ihrem Browser ein Dialogfeld zum Speichern von Dateien, das jedoch auf dem Bestätigungsformular verbleibt.

Ich habe versucht, den mehrstufigen Formularweg zu beschreiten, aber nach einem Tag voller seltsamer Weiterleitungen habe ich mich aus dieser Verwirrung zurückgezogen. Begann auch mit der mehrstufigen Formularlogik von ChaosTool. Aber irgendetwas sagt mir, dass das Problem wirklich darin besteht, dass dieses "Push-Download" ein Killer für geführte Prozesse ist.

Vielleicht ein jquery-Bestätigungsdialog, der den ersten Klick auf die Schaltfläche "Exportieren" abfängt, die Bestätigung vollständig in Javascript durchführt, ein PHP / FAPI-Bestätigungsformular vergisst und wenn der Benutzer in jquery bestätigt, sende ich programmgesteuert den Export, den ich abgefangen habe?

Blake Senftner
quelle

Antworten:

3

Soweit ich weiß, ist das nicht möglich. Sie können entweder Inhalte senden (in Ihrem Fall eine Datei) oder umleiten. Nicht beide. Dies ist eine Einschränkung des HTTP-Protokolls

Fuzzy76
quelle
2

Ich denke, Ihre beste Wette könnte darin bestehen, ein Token zu generieren, wenn der Benutzer das Formular sendet, und dann das Token alle erforderlichen Informationen zum Generieren der CSV-Datei speichern zu lassen. Lassen Sie das Formular den Benutzer auf die entsprechende Seite umleiten und verwenden Sie drupal_set_message (), um einen Link bereitzustellen, der das Token enthält.

Wenn Sie auf den Link klicken, kann die CSV-Datei generiert und zu diesem Zeitpunkt an den Benutzer gesendet werden. Zugegeben, es ist komplizierter als nur das Generieren beim Senden eines Formulars, aber wie Fuzzy76 sagt, stehen Sie vor einer Einschränkung des HTTP-Protokolls. Dies ist möglicherweise einfacher als der Versuch, eine JavaScript-basierte Lösung zu erstellen.

Chris Cohen
quelle