2013-04-07 25 views
12

以下示例返回瀏覽器試圖直接顯示的PDF。這工作正常。但是,如果我嘗試下載文件,則下載名稱不是「myPDF.pdf」,而是路徑中的ID(myapp/controller/PDFGenerator/ID)。是否可以將文件下載名稱設置爲「myPDF.pdf」?ASP.NET MVC FileStreamResult,fileDownloadName未使用

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"); 
} 

回答

15

不,這是不可能的PDF內聯顯示。你可以做到這一點,如果你發送的Content-Disposition頭作爲附件:

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

還要注意我如何去除不必要的MemoryStream你使用並加載在內存中的PDF在那裏你可以把它直接傳輸到客戶本來會更有效率。

+0

是的,那是我的答案的關鍵所在。如果你想要文件內聯顯示,**不能**指定文件名。如果您以內聯方式顯示PDF文件,則打開該客戶端計算機上的插件以打開PDF文件。各種插件的行爲會有所不同。 – 2013-04-07 13:09:11

+0

@Nalan M答案可能會迫使其下載,在大多數情況下。所以,不應該說這是不可能的。 – 2016-02-26 09:05:45

+0

有一個問題,誰負責在這裏處理流? – Legends 2016-04-09 22:03:54

4

如果使用FileStreamResult下載文件,嘗試在控制器

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

當我導出爲PDF操作時,將以**純文本**的形式返回數據,替換** iframe **而不是附件類型。我不得不添加這兩行來強制它彈出保存對話框。 – OldTrain 2015-04-09 06:33:01

0

有可能通過使ID表示沒有擴展名的文件名的字符串使用這個。

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

的網址,然後再這樣結束

..PDFGenerator/Document2?docid=15