在浏览器中打开文件而不是下载它

时间:2013-10-16 18:47:07

标签: c# asp.net-mvc azure

我有一个MVC项目,它会向用户显示一些文档。这些文件当前存储在Azure blob存储中。

目前,文档是从以下控制器操作中检索的:

[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")]
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
    // get byte array from blob storage
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
    string mimeType = "application/octet-stream";
    return File(doc, mimeType, fileName);
}

现在,当用户点击如下链接时:

<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf

然后,该文件将下载到其浏览器的下载文件夹中。我希望发生的事情(我认为是默认行为)是文件只是在浏览器中显示。

我尝试更改mimetype并将返回类型更改为FileResult而不是ActionResult,两者都无济于事。

如何在浏览器中显示文件而不是下载?

4 个答案:

答案 0 :(得分:88)

感谢所有答案,解决方案是所有答案的组合。

首先,因为我使用byte[]控制器操作需要FileContentResult而不仅仅是FileResult。感谢:What's the difference between the four File Results in ASP.NET MVC

其次,mime类型不需要是octet-stream。据说,使用流导致浏览器只下载文件。我不得不更改类型application/pdf。我需要探索更强大的解决方案来处理其他文件/ mime类型。

第三,我必须添加一个标题,将content-disposition更改为inline。使用this post我发现我必须修改我的代码以防止重复的标头,因为内容处置已经设置为attachment

成功的代码:

public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
    string mimeType = "application/pdf"
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName);
    return File(doc, mimeType);
} 

答案 1 :(得分:15)

看起来有人在前一段时间问过类似的问题:

how to force pdf files to open in a browser

答案说你应该使用标题:

Content-Disposition: inline; filename.pdf

答案 2 :(得分:4)

浏览器应根据mime-type决定下载或显示。

试试这个:

string mimeType = "application/pdf";

答案 3 :(得分:0)

只需返回PhysicalFileResult并使用HttpGet方法,URL将打开pdf文件

public ActionResult GetPublicLink()
{
     path = @"D:\Read\x.pdf";
    return new PhysicalFileResult(path, "application/pdf");
}