Vamos a ver como descargar ficheros mediante los Action Result de los controladores en Net Core.


Vamos a trabajar solo con un controlador, HomeController y la vista Index.

En vez de devolver un IActionResult vamos a devolver un FileResult, es lo mismo pero devuelve un fichero en lugar de una vista. Creamos una función que devuelva un FileResult, guardamos el mensaje en una variable y después la convertimos a un array de bytes.

Devolvemos el array de bytes, el tipo mime del fichero y su nombre con su extensión.

public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public FileResult DownloadMessage()
        {
            String text = "Hola mundo" + Environment.NewLine + "Hoy es Martes";
            byte[] result = Encoding.ASCII.GetBytes(text);
            return File(result, "text/plain", "mensaje.txt");
        }
    }

En la vista, añadimos un enlace que nos lleve al File Result que acabamos de crear.

<div class="jumbotron jumbotron-fluid">
    <h1 class="text-center display-4">Home</h1>
</div>

<div class="container">
    <div class="list-group">
        <a asp-controller="Home"
           asp-action="DownloadMessage"
           class="list-group-item list-group-item-action">
            Descargar Mensaje
        </a>
    </div>
</div>

Si ejecutamos se nos debería descargar el fichero al pulsar el enlace.


También podemos generar el fichero usando el objeto Memory Stream, creamos otra función que devuelva un FileResult, instanciamos el obejto MS mediante el array de bytes y lo devolvemos junto al tipo mime y el nombre del fichero.

public FileResult DownloadStream()
        {
            String text = "Hola mundo" + Environment.NewLine + "Hoy es Martes";
            byte[] result = Encoding.ASCII.GetBytes(text);
            var stream = new MemoryStream(result);
            return File(stream, "text/plain", "stream.txt");
        }

En la vista añadimos otro enlace al FR recién creado.

<a asp-controller="Home"
           asp-action="DownloadStream"
           class="list-group-item list-group-item-action">
            Descargar Stream
</a>

Si ejecutamos debería funcionar de la misma forma.


Un FileResult funciona como un IActionResult por lo que podemos añadirle el decorador de Post. Creamos una función que recibirá el contenido del fichero mediante un formulario y lo guardaremos en un fichero HTML.

Para ello le indicamos el tipo mime y la extensión correspondiente.

[HttpPost]
public FileResult DownloadPersonalizado(String mensaje)
        {
            String text = mensaje;
            byte[] result = Encoding.ASCII.GetBytes(text);
            return File(result, "text/html", "personalizado.html");
            //return File(result, "text/html");
        }

En la vista creamos un formulario cuyo action sea el del FileResult.

<div class="card">
        <div class="card-body">
            <form method="post" asp-action="DownloadPersonalizado">
                <div class="form-group">
                    <input type="text" name="mensaje" class="form-control" />
                </div>
                <button type="submit" class="btn btn-primary">Descargar Personalizado</button>
            </form>
        </div>
    </div>

Si ejecutamos se nos descargará un fichero HTML con el contenido que le pasemos.


Al devolver el archivo no es obligatorio indicarle el tercer parámetro (el nombre del fichero y su extensión) pero si no lo ponemos no se descargará el fichero, se abrirá su contenido en el navegador al igual que en la página de Jquery al intentar descargarlo.


CUIDADO

Si indicamos el tercer parámetro no debemos olvidarnos de colocarle la extensión del fichero porque si no se nos descargará sin extensión independientemente de que el usuario tenga desactivado el uso de las extensiones.

También deberemos tener cuidado y poner la extensión del fichero adecuadoa al tipo mime.


Autor/a: Gerard Alexander Nina Picón

Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma

Centro: Tajamar

Año académico: 2020-2021

Código: Enlace a GitHub

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.