En WebForms, normalmente tendría un código como este para permitir que el navegador presente una ventana emergente "Descargar archivo" con un tipo de archivo arbitrario, como un PDF, y un nombre de archivo:
Response.Clear()
Response.ClearHeaders()
''# Send the file to the output stream
Response.Buffer = True
Response.AddHeader("Content-Length", pdfData.Length.ToString())
Response.AddHeader("Content-Disposition", "attachment; filename= " & Server.HtmlEncode(filename))
''# Set the output stream to the correct content type (PDF).
Response.ContentType = "application/pdf"
''# Output the file
Response.BinaryWrite(pdfData)
''# Flushing the Response to display the serialized data
''# to the client browser.
Response.Flush()
Response.End()
¿Cómo realizo la misma tarea en ASP.NET MVC?
asp.net-mvc
download
mgnoonan
fuente
fuente
Para forzar la descarga de un archivo PDF, en lugar de ser manejado por el complemento PDF del navegador:
Si desea permitir que el navegador maneje por su comportamiento predeterminado (complemento o descarga), simplemente envíe dos parámetros.
Deberá utilizar el tercer parámetro para especificar un nombre para el archivo en el cuadro de diálogo del navegador.
ACTUALIZACIÓN: Charlino tiene razón, al pasar el tercer parámetro (nombre de archivo de descarga)
Content-Disposition: attachment;
se agrega al encabezado de respuesta Http. Mi solución fue enviarapplication\force-download
como tipo mime, pero esto genera un problema con el nombre de archivo de la descarga por lo que se requiere el tercer parámetro para enviar un buen nombre de archivo, eliminando así la necesidad de forzar una descarga .fuente
content-disposition: attachment; filename=MyRenamedFile.pdf
; esto es lo que fuerza la descarga. Le sugiero que vuelva a poner el tipo MIME enapplication/pdf
.Content-Disposition: attachment;
relación.Puedes hacer lo mismo en Razor o en el controlador, así ...
O en el controlador ...
Probé esto en Chrome e IE9, ambos están descargando el archivo pdf.
Probablemente debería agregar que estoy usando RazorPDF para generar mis PDF. Aquí hay un blog al respecto: http://nyveldt.com/blog/post/Introducing-RazorPDF
fuente
Debería mirar el método File del Controller. Para eso es exactamente. Devuelve FilePathResult en lugar de ActionResult.
fuente
mgnoonan,
Puede hacer esto para devolver un FileStream:
fuente
Aunque los resultados de la acción estándar FileContentResult o FileStreamResult se pueden utilizar para descargar archivos, la mejor solución podría ser crear un resultado de acción personalizado para su reutilización.
Como ejemplo, creemos un resultado de acción personalizado para exportar datos a archivos de Excel sobre la marcha para su descarga.
La clase ExcelResult hereda la clase ActionResult abstracta y anula el método ExecuteResult.
Estamos usando el paquete FastMember para crear DataTable a partir del objeto IEnumerable y el paquete ClosedXML para crear un archivo de Excel a partir de DataTable.
En el controlador, use el resultado personalizado de la acción ExcelResult de la siguiente manera
Dado que estamos descargando el archivo usando HttpGet, cree una Vista vacía sin modelo y diseño vacío.
Publicación de blog sobre el resultado de una acción personalizada para descargar archivos que se crean sobre la marcha:
https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html
fuente
Use el tipo de archivo .ashx y use el mismo código
fuente