2011-01-13 21 views
10

Tengo una ventana emergente que muestra "Espere mientras se descarga el archivo". Esta ventana emergente también ejecuta el siguiente código para iniciar la descarga del archivo. ¿Cómo puedo cerrar la ventana emergente una vez que se haya completado la descarga del archivo? Necesito alguna manera de detectar que la descarga del archivo se haya completado, así que puedo llamar a self.close() para cerrar esta ventana emergente.¿Cómo puedo detectar cuándo se completó la descarga de un archivo en ASP.NET?

System.Web.HttpContext.Current.Response.ClearContent(); 
System.Web.HttpContext.Current.Response.Clear(); 
System.Web.HttpContext.Current.Response.ClearHeaders(); 
System.Web.HttpContext.Current.Response.ContentType = fileObject.ContentType; 
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Concat("attachment; filename=", fileObject.FileName)); 
System.Web.HttpContext.Current.Response.WriteFile(fileObject.FilePath); 
Response.Flush(); 
Response.End(); 
+7

respuesta corta ... no se puede! –

+0

La descarga es del lado del cliente, ASP.NET es del lado del servidor. –

+1

No puedes. Por qué bloquear la interfaz de usuario esperando una descarga. Seguramente, el funcionamiento correcto de su página puede continuar sin dicha espera, ya que no puede haber una dependencia del archivo descargado. La web no funciona de esa manera, ¿por qué quieres? – spender

Respuesta

0

Algunos cortes son en torno a que implica saber cuándo la última pieza de la memoria intermedia se ha enviado o comprobar la propiedad HttpResponse.IsClientConnected.

0

Manejo el problema de forma diferente en Javascript, lo que puede o no funcionar para usted.

  • Crear un elemento DIV oculto, con el mensaje 'Archivo está descargando ...' en lugar de un cuadro emergente.
  • Muestra el div cuando la descarga se inicia
  • Una vez que se hace clic en cualquier otro elemento en las formas , ocultar el div nuevo ..
  • También puede establecer un temporizador para ocultar la descarga de mensajes div después de tanto cantidad de tiempo ...

calculo vez que el usuario hace clic en otro elemento, ya sea que ya conoce la descarga se realiza, o ella está listo para hacer otra cosa, así que el mensaje se convierte en irrelevante y puede desaparecer ....

2

Una idea:

Si controla la descarga de archivos a sí mismo en el código del lado del servidor escribiendo trozo por trozo de la secuencia de respuesta, entonces sabrá cuando el archivo tenía la descarga final. Simplemente tendría que conectar el FileStream a la secuencia de respuesta, enviar fragmentos de datos por partes y redirigirlos después de completarlos. Esto puede estar dentro de tu ventana emergente.

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("content-disposition", "attachment; filename=bob.mp3"); 
Response.AppendHeader("content-length", "123456789"); 

Asegúrate de marcar Response.IsClientConnected al escribir en el flujo de respuesta.

0

La forma de hacerlo es en su ventana emergente para llamar al servidor mediante sondeo AJAX para obtener alguna respuesta que indique que el archivo se ha descargado.

Ej .: justo antes de enviar el archivo, almacene sessionID + FileName en un DB o sesión o lo que sea.

En el cliente, en su emergente, sondear un servicio web a través de AJAX - esto podría ser incluso un WebMethod como Bool IsContentFlushed(string sessionID, string fileName);

Después de hacer Response.Flush(); quite esta Id.sesión + Nombre de archivo de su tienda.

Llamada Response.Close() en vez de Response.End() - la última es muy brutal, y por lo general es excesiva.

1

Hay una solución donde puede rastrear el estado de descarga transfiriendo el archivo en paquetes más pequeños y verificando si se han transferido todos los paquetes. La solución no es mío, pero se puede encontrar aquí: File Download in ASP.NET and Tracking the Status of Success/Failure of Download

//Function for File Download in ASP.Net in C# and 
//Tracking the status of success/failure of Download. 
private bool DownloadableProduct_Tracking() 
{ 
//File Path and File Name 
string filePath = Server.MapPath("~/ApplicationData/DownloadableProducts"); 
string _DownloadableProductFileName = "DownloadableProduct_FileName.pdf"; 

System.IO.FileInfo FileName = new System.IO.FileInfo(filePath + "\\" + _DownloadableProductFileName); 
FileStream myFile = new FileStream(filePath + "\\" + _DownloadableProductFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

//Reads file as binary values 
BinaryReader _BinaryReader = new BinaryReader(myFile); 

//Ckeck whether user is eligible to download the file 
if (IsEligibleUser()) 
{ 
//Check whether file exists in specified location 
if (FileName.Exists) 
{ 
    try 
    { 
    long startBytes = 0; 
    string lastUpdateTiemStamp = File.GetLastWriteTimeUtc(filePath).ToString("r"); 
    string _EncodedData = HttpUtility.UrlEncode(_DownloadableProductFileName, Encoding.UTF8) + lastUpdateTiemStamp; 

    Response.Clear(); 
    Response.Buffer = false; 
    Response.AddHeader("Accept-Ranges", "bytes"); 
    Response.AppendHeader("ETag", "\"" + _EncodedData + "\""); 
    Response.AppendHeader("Last-Modified", lastUpdateTiemStamp); 
    Response.ContentType = "application/octet-stream"; 
    Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName.Name); 
    Response.AddHeader("Content-Length", (FileName.Length - startBytes).ToString()); 
    Response.AddHeader("Connection", "Keep-Alive"); 
    Response.ContentEncoding = Encoding.UTF8; 

    //Send data 
    _BinaryReader.BaseStream.Seek(startBytes, SeekOrigin.Begin); 

    //Dividing the data in 1024 bytes package 
    int maxCount = (int)Math.Ceiling((FileName.Length - startBytes + 0.0)/1024); 

    //Download in block of 1024 bytes 
    int i; 
    for (i = 0; i < maxCount && Response.IsClientConnected; i++) 
    { 
     Response.BinaryWrite(_BinaryReader.ReadBytes(1024)); 
     Response.Flush(); 
    } 
    //if blocks transfered not equals total number of blocks 
    if (i < maxCount) 
     return false; 
    return true; 
    } 
    catch 
    { 
    return false; 
    } 
    finally 
    { 
    Response.End(); 
    _BinaryReader.Close(); 
    myFile.Close(); 
    } 
} 
else System.Web.UI.ScriptManager.RegisterStartupScript(this, GetType(), 
    "FileNotFoundWarning","alert('File is not available now!')", true); 
} 
else 
{ 
System.Web.UI.ScriptManager.RegisterStartupScript(this, GetType(), 
    "NotEligibleWarning", "alert('Sorry! File is not available for you')", true); 
} 
return false; 
} 
Cuestiones relacionadas