不使用ASP.NET MVC FileStreamResult,fileDownloadName

时间:2013-04-07 13:01:27

标签: asp.net-mvc pdf-generation filestreamresult

以下内容返回PDF,浏览器会尝试直接显示内联。这工作正常。但是,如果我尝试下载该文件,则下载名称不是“myPDF.pdf”,而是路由中的ID(myapp / controller / PDFGenerator / ID)。是否可以将文件下载名称设置为“myPDF.pdf”?

public FileStreamResult PDFGenerator(int id)
{
    MemoryStream ms = GeneratePDF(id);

    byte[] file = ms.ToArray();
    MemoryStream output = new MemoryStream();
    output.Write(file, 0, file.Length);
    output.Position = 0;
    HttpContext.Response.AddHeader("content-disposition", 
    "inline; filename=myPDF.pdf");

    return File(output, "application/pdf", fileDownloadName="myPDF.pdf");
}

3 个答案:

答案 0 :(得分:17)

不,内联显示PDF是不可能的。如果您将Content-Disposition标头作为附件发送,则可以实现此目的:

public ActionResult PDFGenerator(int id)
{
    Stream stream = GeneratePDF(id);
    return File(stream, "application/pdf", "myPDF.pdf");
}

另请注意我是如何删除您正在使用的不必要的MemoryStream并将PDF加载到内存中,您可以将其直接传输到客户端,这样效率会更高。

答案 1 :(得分:4)

如果您使用FileStreamResult下载文件,请尝试在控制器中使用此文件

Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=FileName.pdf");

答案 2 :(得分:0)

可以通过使id成为表示没有扩展名的文件名的字符串。

public ActionResult PDFGenerator(string id, int? docid)
{
    Stream stream = GeneratePDF(docid);
    return new FileStreamResult(stream , "application/pdf");
}

然后,网址会像这样结束

  ..PDFGenerator/Document2?docid=15