Tengo un archivo ashx con un IHttpHandler. Cuando publico algunos datos en este IHttpHandler, trabajo un poco, creo un archivo y luego quiero que ese archivo se devuelva al usuario para que pueda guardarlo a través de su navegador.Escribir archivo en HttpResponse, el navegador no solicita guardar
Con el archivo creado, esta es la forma en que intento escribir el archivo de nuevo a la respuesta:
HttpResponse response = context.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT");
response.WriteFile("C:\tempstuff\MYFILE.EXT");
En un bloque finally más adelante, llamaré:
response.End()
Cuando llama a este controlador, no pasa nada. Se devuelve la respuesta 200, no se generan errores, pero el navegador no solicitará al usuario que guarde este archivo.
Esto es lo que la respuesta, como se recoge en Fiddler, se ve así:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 23 Aug 2012 12:12:19 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=MYFILE.EXT
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 781053
Connection: Close
[raw content of the file here]
Esta respuesta parece correcto para mí. Contiene el contenido del archivo; sin embargo, en ninguno de los principales navegadores, ningún diálogo de archivo me pide que guarde el archivo.
¿Qué estoy haciendo mal aquí?
Actualización: En caso de que ayude, aquí es donde estoy usando JavaScript desde mi aplicación web para llamar a este HttpHandler.
$.ajax({
type: 'POST',
url: ashxUrl,
data: postData,
success: function (result) {
// Doin' stuff on success
},
error: function (error) {
// Doin' stuff on error.
}
});
Intenté exactamente lo mismo. Hice una página simple 'Download.ashx' con el código de arriba, y la PUBLICÉ desde otra página,' Default.aspx'. En los tres navegadores (IE, FF, Chrome), funciona perfectamente, y obtengo casi los mismos encabezados en Fiddler. ¿No estoy seguro de qué más podría estar pasando? – mellamokb
¡Interesante! Tal vez sería útil describir mi JavaScript, donde estoy haciendo explícitamente esta solicitud de llamada. Editaré la publicación principal para incluir este fragmento. EDITAR: agregué el fragmento de JS. –
Ah. Sí, eso ayuda. No puede hacer una [descarga de archivos a través de AJAX] (http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -cuerpo). Necesitará una solución alternativa [como esta] (http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data). – mellamokb