14

以下返回浏览器尝试直接内联显示的 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");
}
4

3 回答 3

18

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

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

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

于 2013-04-07T13:03:28.500 回答
5

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

Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=FileName.pdf");
于 2015-03-10T12:02:39.963 回答
0

可以通过使 id 成为一个字符串来表示不带扩展名的文件名。

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

然后网址就这样结束了

  ..PDFGenerator/Document2?docid=15
于 2015-12-14T05:35:46.607 回答