2011-05-29 97 views
13

我使用ASP.NET MVC 3,我有一个返回PDF文件这样的控制器操作:打开PDF结果与MVC的浏览器选项卡3

Public Class ReportController 
    ... 
    Function Generate(id As Integer) As ActionResult 
     ... 
     Return File(output, "application/pdf", "something.pdf") 
     ' "output" is a memory stream 
    End Function 

代码工作,但Firefox不显示结果在选项卡中,结果可以下载或使用Adobe Reader打开。

我知道Firefox可以在标签中显示PDF,因为我可以只搜索一些PDF,点击链接,PDF将在标签中打开。

如何设置操作以便PDF在标签中打开?

回答

21

我从related links on the right答案:

Response.AppendHeader("Content-Disposition", "inline") 
Return File(output, "application/pdf") 

的PDF在选项卡中打开,但文件名提示丢失,即使我不喜欢这样写道:

Response.AppendHeader("Content-Disposition", "inline; filename=something.pdf") 
Return File(output, "application/pdf", "something.pdf") 

所以最后我没有刻意去给文件名暗示都没有。

编辑

ASP.NET MVC 3的文件有3个参数:

Return File(output, "application/pdf", "something.pdf") 

将增加Content-Disposition: attachment; filename="something.pdf"的响应头,即使已经存在一个内容处置的响应头。

因此,如果您手动将Content-Disposition添加到标头,然后使用带有3个参数的File,则最终将使用两个 Content-Disposition标头。如果响应头是这样的,Firefox 8会说响应已损坏。

所以,最好的办法现在就这样做是添加内容处置手动“内联”,然后用文件有两个参数:

Response.AppendHeader("Content-Disposition", "inline; filename=something.pdf") 
Return File(output, "application/pdf") 
+1

一些快速测试显示Firefox,IE6/IE7和Chrome都使用文件名。但是,IE8没有。可能有用的知道。 – 2011-06-24 20:04:07

+0

要获取任何类型的文件(不仅仅是PDF)的内容类型,您可以在System.Web中调用MimeMapping.GetMimeMapping(filename)。 – 2016-08-03 20:12:16

1

这可在您的浏览器中进行配置。您可以将设置更改为在浏览器中下载/打开,或在相关应用程序中打开所有文件类型的工具 - >选项 - >应用程序部分。这与你的代码无关。

+0

但我可以在互联网上找到一些链接到PDF,以及当我点击链接时,PDF将在标签页中打开,所以我认为我的浏览器设置不是问题。 – 2011-05-29 16:37:21

+0

尝试使用iframe并将源文件作为pdf文件路径