2012-02-01 15 views
5

Estoy publicando una URL de página por ejemplo, mysite.com/disclaimer/someinfo esta página muestra un acuerdo, y si el usuario hace clic en el botón Aceptar, se transmite un archivo PDF como archivo adjunto .Response.WriteFile & Response.Redirect

El propósito de esto es que el usuario puede compartir esta URL pero cualquier otra persona que siga el enlace también debe leer el acuerdo antes de descargar el archivo. El archivo real no tiene una URL, pero se encuentra en otra parte del servidor, por lo que la única forma de descargar el archivo es presionando el botón "[Aceptar]".

Sin embargo, lo que me resulta difícil es que después de hacer clic en el botón y comenzar la descarga me gustaría que la página "se vaya". La página con los botones permanece en la pantalla. Idealmente, serían redirigidos a la página de la que provenían. Estoy interesado en no requerir javascript ni cookies. El referente se almacena en la carga de la página inicial en un campo oculto en el formulario.

He intentado diferentes enfoques, intentando escribir un redireccionamiento 307 en el encabezado con el archivo que generó advertencias para el usuario de que sus datos de publicación estaban siendo redirigidos. El código que aparece a continuación solo funciona en navegadores compatibles con la actualización de metadatos (por ejemplo, Firefox; IE7 no Chrome/Safari)

Veo la lógica de por qué esto no funciona. Hay una respuesta para el navegador y ese es el archivo como se esperaba. ¿Cuál sería la forma correcta de enviarles el archivo y luego redirigir el navegador a otra página? Se siente de los usuarios p.o.v. que esta página "Aceptar" desaparezca una vez que hayan presionado el botón.

que tengo:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.UrlReferrer != null & Request.UrlReferrer.ToString() != "") 
     { 
      Uri referrer = Request.UrlReferrer; 
      if (!IsPostBack) 
      { hfReferrer.Value = Request.UrlReferrer.ToString(); } 
     } 
    } 

    protected void buttonAccept_Click(object sender, EventArgs e) 
    { 
     //stream file 
     Node nodeCurrent = Node.GetCurrent(); 
     string fileName = nodeCurrent.GetProperty("documentFile").Value.ToString(); 
     System.IO.FileInfo file = new System.IO.FileInfo(fileName); 
     if (file.Exists) //set appropriate headers 
     { 
      Response.Clear(); 

      if (hfReferrer.Value !="") 
      {Response.AddHeader("Refresh", string.Format("3; URL={0}", hfReferrer.Value));} 

      Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
      Response.AddHeader("Content-Length", file.Length.ToString()); 
      Response.ContentType = "application/pdf"; 

      // write file to browser 
      Response.WriteFile(file.FullName); 
      Response.End(); 
     } 

Yo prefiero no necesita usar javascript/pop-ups etc. Actualmente el usuario sólo tiene que hacer clic en un enlace para ir a otra página, pero este doesn' Me siento bien.

Idealmente, me gustaría seguir un buen estándar para esto. Pero no estoy seguro de dónde mirar.

Respuesta

2

Sugeriría probar un comportamiento ligeramente diferente. En el controlador de eventos buttonAccept_Click, redirija al usuario a una página de agradecimiento. En la Página_carga de esta página de agradecimiento, tenga el código para descargar el archivo. Esto es muy fácil de implementar y brinda una mejor experiencia para el usuario.

+0

Solo asegúrese de validar la referencia a esa página es la página de formulario para que los usuarios no puedan copiar esa URL y obtener acceso directo al archivo en cada carga de página. – CoderMarkus

Cuestiones relacionadas