我有一个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,两者都无济于事。
如何在浏览器中显示文件而不是下载?
答案 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");
}