Devolver un fichero

En ocasiones, queremos hacer que nuestros usuarios descarguen el típico fichero Excel, PDF, Word, etc., pero no queremos que estos se abran en la misma ventana del explorer, sino que se les dé la opción de guardar el fichero o que se abra en la aplicación correspondiente.

Conseguirlo es muy sencillo, y para ello no tenemos más que "engañar" al navegador y decirle que lo que se está descargando no es un Excel, PDF o Word en particular, sino que se trata de una serie de bytes que se tiene que bajar sin rechistar

El siguiente código hace esa función:

octet.cs
public static void descarga(string filepath, string filename)
{
            Response.Clear();
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
            Response.Flush();
            Response.WriteFile(filepath);
            Response.End();
}


Esta función se puede ejecutar desde donde queramos (lo típico es llamarlo cuando el usuario presiona un botón). básicamente, lo que hace es:

1.- Limpia el contenido de salida.
2.- Le cambia el contentType a tipo octet... aquí es donde "engañamos al navegador".
3.- Le añadimos la cabecera Content-Disposition y le damos un nombre al fichero. Esto es opcional, y lo que hace es dar el nombre que queremos que aparezca si el usuario decide guardar el fichero.
4.- Manda la info que tenemos hasta ahora (la única cabecera que hemos añadido) a la salida hacia el usuario.
5.- Mandamos el fichero en sí desde Response.WriteFile(filepath), donde, obviamente, filepath es el path interno del fichero en nuestro servidor.
6.- Enviamos todo y terminamos la ejecución de la página.