109 votos

¿Cómo puedo presentar un archivo para su descarga desde un controlador MVC?

En WebForms, que normalmente debería tener un código como este para que el navegador presente un "Descargar Archivo" de la ventana emergente con cualquier tipo de archivo, como PDF, y un nombre de fichero:

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 puedo realizar la misma tarea en ASP.NET MVC?

181voto

tvanfosson Puntos 268301

Devolver un FileResult o FileStreamResult de su acción, dependiendo de si existe el archivo o crear sobre la marcha.

public ActionResult GetPdf(string filename)
{
    return File(filename, "application/pdf", Server.UrlEncode(filename));
}

62voto

guzart Puntos 2269

Para forzar la descarga de un archivo PDF, en lugar de ser manejado por el Navegador el plugin de PDF:

public ActionResult DownloadPDF()
    {
        return File("~/Content/MyFile.pdf", "application/pdf", "MyRenamedFile.pdf");
    }

Si desea que el navegador de manejar por su comportamiento predeterminado (plugin o descarga), acaba de enviar dos parámetros.

public ActionResult DownloadPDF()
    {
        return File("~/Content/MyFile.pdf", "application/pdf");
    }

Usted necesitará utilizar el tercer parámetro para especificar un nombre para el archivo en el explorador de diálogo.

ACTUALIZACIÓN: Charlino es a la derecha, 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 enviar a application\force-download como el mime-type, pero esto genera un problema con el nombre de archivo de la descarga así que el tercer parámetro es necesario para enviar un buen nombre de archivo, por lo tanto, eliminando la necesidad de "forzar una descarga".

4voto

Martin Peck Puntos 8078

Usted debe buscar en el método de Archivo del Controlador. Esto es exactamente lo que es. Devuelve un FilePathResult en lugar de un ActionResult.

3voto

Leniel Macaferi Puntos 38324

mgnoonan,

Usted puede hacer esto para volver a una FileStream:

/// <summary>
/// Creates a new Excel spreadsheet based on a template using the NPOI library.
/// The template is changed in memory and a copy of it is sent to
/// the user computer through a file stream.
/// </summary>
/// <returns>Excel report</returns>
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult NPOICreate()
{
    try
    {
        // Opening the Excel template...
        FileStream fs =
            new FileStream(Server.MapPath(@"\Content\NPOITemplate.xls"), FileMode.Open, FileAccess.Read);

        // Getting the complete workbook...
        HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true);

        // Getting the worksheet by its name...
        HSSFSheet sheet = templateWorkbook.GetSheet("Sheet1");

        // Getting the row... 0 is the first row.
        HSSFRow dataRow = sheet.GetRow(4);

        // Setting the value 77 at row 5 column 1
        dataRow.GetCell(0).SetCellValue(77);

        // Forcing formula recalculation...
        sheet.ForceFormulaRecalculation = true;

        MemoryStream ms = new MemoryStream();

        // Writing the workbook content to the FileStream...
        templateWorkbook.Write(ms);

        TempData["Message"] = "Excel report created successfully!";

        // Sending the server processed data back to the user computer...
        return File(ms.ToArray(), "application/vnd.ms-excel", "NPOINewFile.xls");
    }
    catch(Exception ex)
    {
        TempData["Message"] = "Oops! Something went wrong.";

        return RedirectToAction("NPOI");
    }
}

0voto

GeekyMonkey Puntos 5036

Yo no creo que sea la mejor respuesta, pero todavía se PUEDE hacer que en una vista.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X