2009-08-26 20 views
8

Me gustaría utilizar la respuesta de descarga de archivos ASP.NET estándar, como in other Stack Overflow question.Cómo implementar una descarga de archivos en ASP.NET AJAX

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Pero dentro del panel de actualización no funciona. ¿Qué tengo que hacer para obtener un archivo si el evento de descarga se desencadena dentro del panel de actualización?

+0

Tengo curiosidad por saber por qué no solo construyes una URL que apunta al archivo que deseas ofrecerle al cliente, y le das eso al navegador para usarlo para descargar tu archivo. ? – 7wp

+0

Es un archivo txt, que normalmente se mostraría directamente en el navegador. Si el tipo de contenido está configurado en "application/octet-stream", supongo que el navegador iniciará una descarga en el disco. – awe

+0

El archivo "txt" es solo un ejemplo. Y no se muestra directamente en el navegador. Con esta respuesta, siempre se puede descargar. –

Respuesta

2

Necesita tener esto en un aspx independiente que no use ajax. Ajax está actualizando el marcado HTML existente en una página del lado del cliente. Lo que intenta hacer aquí es reemplazar el contenido de la respuesta en el servidor antes de enviar algo al cliente.

Usted podría intentar esto:

tiene una página llamada Download.aspx que contiene el código de transmisión que ya tiene.

En la página original, tiene una llamada de JavaScript que llama a la página de descarga de esta manera:

window.location.replace('Download.aspx'); 
0

Usted puede intentar hacer un controlador para este work.It es más seguro si se puede modificar también. Para este trabajo, debe encriptar la ruta del archivo en su página donde coloca un enlace para el archivo.

<a href=\"Downloads.ashx?f={0}\" target=\"_blank\">Your link to file</a> 
//{0} -> Encrypted file path 
//target = _blank force browser to download file in another window 

Hay un montón de técnicas de cifrado en here

En su página de Handler, es necesario descifrar la ruta del archivo en un solo original, por lo que se puede leer con System.IO bibliotecas.

context.Response.ContentType = ""; //-->MimeType for your file's extension 

Puede especificar su tipo Mime por registro a menos que su tipo mime sea estático como imágenes.

string mimeType = Registry.GetValue(string.Format(@"HKEY_CLASSES_ROOT\.{0}", 
        Path.GetExtension(decryptedfilePath)), "Content Type", null).ToString(); 

//Then everything is ready for download 

byte[] buffer = File.ReadAllBytes(decryptedfilePath); 
context.Response.OutputStream.Write(buffer, 0 , buffer.Length); 
context.Response.Flush(); 

Buena suerte.

0

que era capaz de resolver esto llamando a una función de JavaScript, que llama __doPostBack sin __EVENTTARGET.

function GxGridView_Export(exportLink, exportType) { 
    var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider"); 
    __doPostBack('', containingGrid.attr('id') + "###" + exportType); 
} 

La cuadrícula del lado del servidor continuación, analiza la __EVENTARGUMENT y hace que el archivo de exportación.

var eventArg = Page.Request.Form["__EVENTARGUMENT"]; 
if (!string.IsNullOrEmpty(eventArg) && eventArg.Contains("###")) 
{ 
    var eventParams = eventArg.Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries); 
    if (eventParams.Length == 2 && eventParams[0] == this.ClientID) 
    { 
     ExportGrid(eventParams[1]); 
     return; 
    } 
} 
+0

Inicialmente traté de pasar el ID de cuadrícula como el objetivo del evento, pero doPostBack fue de alguna manera lo suficientemente inteligente como para saber que es un control dentro de un panel ajax, y make y ajax de devolución de datos en su lugar. –

Cuestiones relacionadas