2010-10-26 13 views
9

Escribí un script de descarga después de una maravillosa ayuda del desbordamiento de la pila el otro día. Sin embargo, ahora he encontrado que después de que el archivo se haya descargado, necesito volver a cargar la página para deshacerme de la plantilla de progreso en la página aspx. El código para eliminar la plantilla funcionó antes de agregarlo en el código de descarga.Actualización de la página después de la descarga de archivos

código para eliminar la plantilla progreso: upFinanceMasterScreen.Update();

He intentado llamar a poner esto antes y después de la redirección a los IHttpHandler

Response.Redirect("Download.ashx?ReportName=" + "RequestingTPNLeagueTable.pdf"); 


public class Download : IHttpHandler { 

public void ProcessRequest(HttpContext context) 
{  

    StringBuilder sbSavePath = new StringBuilder(); 
    sbSavePath.Append(DateTime.Now.Day); 
    sbSavePath.Append("-"); 
    sbSavePath.Append(DateTime.Now.Month); 
    sbSavePath.Append("-"); 
    sbSavePath.Append(DateTime.Now.Year); 

    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.ContentType = "application/pdf"; 
    HttpResponse objResponce = context.Response; 
    String test = HttpContext.Current.Request.QueryString["ReportName"]; 
    HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + test); 
    objResponce.WriteFile(context.Server.MapPath(@"Reports\" + sbSavePath + @"\" + test));  

} 
public bool IsReusable { get { return true; } } 

Gracias por cualquier ayuda que puede proporcionar!

Respuesta

25

Cuando envía de vuelta un archivo para que el usuario descargue, que es la solicitud HTTP. En otras palabras, puede tener un post-back que actualiza la página del navegador o puede enviar un archivo para que el usuario lo descargue. No puedes hacer ambas cosas sin trucos especiales.

Esta es la razón por la mayoría de los sitios cuando se descarga un archivo, se primera le lleva a una nueva página que dice: "Su descarga está por comenzar", y, posteriormente, "vuelve a dirigir" a que el archivo a descargar usando meta-refresh o javascript.

Por ejemplo, cuando vas aquí para descargar el tiempo de ejecución de .NET 4:

http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true

Se muestra la página, a continuación, utiliza la siguiente etiqueta meta-refresh para dar realidad al usuario el archivo a descargar :

<META HTTP-EQUIV="refresh" content=".1; URL=http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe" /> 

Probablemente tengas que hacer algo similar en tu aplicación. Sin embargo, si está realmente interesado en hacer algo después de el archivo es completamente descargado, no tiene suerte, ya que no hay ningún evento para comunicar eso al navegador. La única manera de hacerlo es con un AJAX upload, como lo hace gmail cuando carga un archivo adjunto.

+2

¡Gracias! No pensé que fuera posible, pero pensé que podría preguntar. – flyersun

+0

Como no puede tener ambos en la misma página, ¿por qué no hacerlo usando dos páginas? Mi enfoque es actualizar y luego abrir otra página (usando JavaScript windows.open()) para manejar la descarga. Es posible que desee comprobar 'Page.ClientScript.RegisterStartupScript'. Espero que esto ayude a otros. – user3454439

4

En mi caso, estaba usando MVC y solo quería que la página se actualizara unos segundos después de que se haya seleccionado el botón de descarga para actualizar el conteo de descargas. Estaba devolviendo el archivo desde el controlador.

Para hacer esto simplemente ha cambiado la vista mediante la adición de un evento onclick al botón de descarga que se llama el siguiente script (también en la vista):

setTimeout(function() { 
     window.location.reload(1); 
    }, 5000); 

Se ajustaba mi propósito ... Espero que ayuda alguien más.

+0

Gracias por un buen enfoque. –

Cuestiones relacionadas