it-swarm.it

È possibile reindirizzare dopo aver "inviato" un file all'utente?

Ho una configurazione in cui un sito genera analisi interne sull'utilizzo del sito. Gli utenti sono in grado di richiedere un download delle loro analisi personali e, poiché queste informazioni sono sensibili, non creo alcun file, genera un file CSV in una variabile e quindi "Spingo" l'utente con questo:

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

In questo modo il browser dell'utente apre una finestra di dialogo "Salva file" e l'utente ottiene il file creato alla fine. Funziona bene, tranne che gli amministratori del sito sono in grado di innescare "esportazioni distruttive" - ​​e in quella situazione ho un modulo di conferma secondario che l'amministratore deve accettare prima che venga eseguita l'esportazione distruttiva.

Il problema è che questa routine "Push download" termina la Drupal elaborazione della pagina. Non appare alcun modo per reindirizzare l'amministratore su una pagina dopo che è stata chiamata la routine di download Push. Gli amministratori ottengono un ' finestra di dialogo Salva file "visualizzata dal loro browser, ma rimangono nel modulo di conferma.

Ho provato a seguire il percorso della forma a più passaggi, ma dopo una giornata trascorsa a pensare con strani reindirizzamenti, sono uscito da quella confusione. Ho iniziato a guardare anche la logica del modulo multi-step di ChaosTool. Ma qualcosa mi dice che il problema è che questo "download push" è un killer di processo guidato.

Forse una finestra di dialogo di conferma jquery che intercetta il clic iniziale sul pulsante 'Esporta', fa la conferma interamente in javascript, dimentica di avere un modulo di conferma php/FAPI e quando l'utente conferma in jquery invio a livello di codice l'esportazione che ho intercettato?

7
Blake Senftner

Sembra che ci siano alcuni trucchi, non ho idea di quanto bene funzionino all'interno di Drupal.

Vedi ad esempio http://www.willmaster.com/blog/automation/one-link-download-and-redirect.php

2
Berdir

Per quanto ne so, ciò non è possibile. Puoi inviare il contenuto (nel tuo caso un file) o reindirizzare. Non entrambi. Questa è una limitazione del protocollo HTTP

3
Fuzzy76

Penso che la tua scommessa migliore potrebbe essere quella di generare un token quando l'utente invia il modulo e quindi fare in modo che il token memorizzi tutte le informazioni necessarie per generare il file CSV. Chiedi al modulo di reindirizzare l'utente alla pagina appropriata e usa drupal_set_message () per fornire un link che contiene il token.

Quando si fa clic sul collegamento, il file CSV può essere generato e inviato all'utente in quel momento. Certo, è più complicato della semplice generazione al momento dell'invio del modulo, ma come dice Fuzzy76, sei contrario a una limitazione del protocollo HTTP. Farlo in questo modo potrebbe essere più semplice che provare a creare una soluzione basata su JavaScript.

2
Chris Cohen

È così che l'ho realizzato in Drupal tramite Jquery/JS My Answere qui -> L'ho raggiunto tramite JS, bene la mia risposta qui -> https://stackoverflow.com/ domande/822.707/php-generare-file-per-download-then-redirect/25.843.144 # 25.843.144

0
Vaibhav Jain