it-swarm-es.com

¿Es posible redirigir después de "enviar" un archivo al usuario?

Tengo una configuración en la que un sitio genera análisis internos sobre el uso del sitio. Los usuarios pueden solicitar una descarga de sus análisis personales, y debido a que esta información es confidencial, no creo ningún archivo, genero un archivo CSV en una variable y luego lo "Empujo" al usuario con esto:

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

Esto hace que el navegador del usuario muestre un cuadro de diálogo "guardar archivo", y el usuario obtiene el archivo creado en su extremo. Esto funciona bien, excepto que los administradores del sitio pueden activar 'exportaciones destructivas', y en esa situación tengo un formulario de confirmación secundario que el administrador debe aceptar antes de que se ejecute la exportación destructiva.

El problema es que esta rutina de "Descarga de inserción" finaliza el procesamiento de página Drupal. No parece haber ninguna forma de redirigir al administrador a alguna página después de que se llama a esa rutina de descarga de inserción. Los administradores obtienen un ' el cuadro de diálogo Guardar archivo 'apareció en su navegador, pero permanecen en el formulario de confirmación.

Intenté seguir la ruta de forma de varios pasos, pero después de un día de cenar con extrañas redirecciones, me retiré de esa confusión. Comencé a mirar la lógica de formulario de múltiples pasos de ChaosTool también. Pero algo me dice que el problema realmente es que esta "descarga Push" es un asesino de procesos guiados.

¿Quizás un diálogo de confirmación de jquery que intercepta el clic inicial del botón 'Exportar', realiza la confirmación completamente en javascript, se olvida de tener un formulario de confirmación php/FAPI, y cuando el usuario confirma en jquery presento la exportación que intercepté mediante programación?

7
Blake Senftner

Parece que hay algunos trucos, ni idea de qué tan bien funcionan dentro de Drupal.

Ver por ejemplo http://www.willmaster.com/blog/automation/one-link-download-and-redirect.php

2
Berdir

Que yo sepa, eso no es posible. Puede enviar contenido (en su caso, un archivo) o redirigir. No ambos. Esta es una limitación del protocolo HTTP

3
Fuzzy76

Creo que su mejor opción podría ser generar un token cuando el usuario envíe el formulario, y luego hacer que el token almacene toda la información necesaria para generar el archivo CSV. Haga que el formulario redirija al usuario a la página correspondiente y use drupal_set_message () para proporcionar un enlace que contenga el token.

Cuando se hace clic en el enlace, el archivo CSV se puede generar y enviar al usuario en ese momento. De acuerdo, es más complicado que solo generarlo en el envío del formulario, pero como dice Fuzzy76, te enfrentas a una limitación del protocolo HTTP. Hacerlo de esta manera podría ser más simple que intentar crear una solución basada en JavaScript.

2
Chris Cohen

Así es como lo logré en Drupal a través de Jquery/JS Mi respuesta estaba aquí -> Lo logré a través de JS, bien mi respuesta aquí -> https://stackoverflow.com/ preguntas/822707/php-generate-file-for-download-then-redirect/25843144 # 25843144

0
Vaibhav Jain