[Asp.net-Mvc] Devolución de un archivo para ver / descargar en ASP.NET MVC


Answers

Tuve problemas con la respuesta aceptada debido a que no había ningún tipo de insinuación sobre la variable "documento": var document = ... Así que estoy publicando lo que funcionó para mí como alternativa en caso de que alguien más tenga problemas.

public ActionResult DownloadFile()
{
    string filename = "File.pdf";
    string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
    byte[] filedata = System.IO.File.ReadAllBytes(filepath);
    string contentType = MimeMapping.GetMimeMapping(filepath);

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = filename,
        Inline = true,
    };

    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, contentType);
}
Question

Me encuentro con un problema al enviar archivos almacenados en una base de datos al usuario en ASP.NET MVC. Lo que quiero es una vista que liste dos enlaces, uno para ver el archivo y que permita que el tipo mimet enviado al navegador determine cómo se debe manejar y el otro para forzar una descarga.

Si elijo ver un archivo llamado SomeRandomFile.bak y el navegador no tiene un programa asociado para abrir archivos de este tipo, entonces no tengo ningún problema con el comportamiento de descarga predeterminado. Sin embargo, si elijo ver un archivo llamado SomeRandomFile.pdf o SomeRandomFile.jpg , quiero que el archivo simplemente se abra. Pero también quiero mantener un enlace de descarga a un lado para que pueda forzar una solicitud de descarga independientemente del tipo de archivo. ¿Esto tiene sentido?

He intentado FileStreamResult y funciona para la mayoría de los archivos, su constructor no acepta un nombre de archivo por defecto, por lo que a los archivos desconocidos se les asigna un nombre de archivo basado en la url (que no conoce la extensión según el tipo de contenido). Si forzo el nombre del archivo al especificarlo, pierdo la capacidad para que el navegador abra el archivo directamente y recibo un aviso de descarga. Alguien más ha encontrado esto.

Estos son ejemplos de lo que he intentado hasta ahora.

//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);

//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);

//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};

¿Alguna sugerencia?




Creo que esta respuesta es más clara (basada en https://.com/a/3007668/550975 )

    public ActionResult GetAttachment(long id)
    {
        FileAttachment attachment;
        using (var db = new TheContext())
        {
            attachment = db.FileAttachments.FirstOrDefault(x => x.Id == id);
        }

        return File(attachment.FileData, "application/force-download", Path.GetFileName(attachment.FileName));
    }



Para ver el archivo (txt por ejemplo):

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain);

Para descargar el archivo (txt por ejemplo):

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain, "TextFile.txt");

Nota: para descargar el archivo, debemos pasar el argumento FileDownloadName




Links