53

我有一个 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

4 回答 4

97

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

首先,因为我使用byte[]的控制器动作需要FileContentResult不仅仅是FileResult. 发现这要归功于:ASP.NET MVC 中的四个文件结果有什么区别

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

第三,我必须添加一个content-dispositioninline. 使用这篇文章我发现我必须修改我的代码以防止重复的标题,因为 content-disposition 已经设置为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);
} 
于 2013-10-16T20:01:59.040 回答
17

好像前段时间有人问过类似的问题:

如何强制pdf文件在浏览器中打开

回答说您应该使用标题:

Content-Disposition: inline; filename.pdf
于 2013-10-16T19:12:57.397 回答
4

浏览器应根据 mime 类型决定下载或显示。

尝试这个:

string mimeType = "application/pdf";
于 2013-10-16T19:11:00.713 回答
0

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

public ActionResult GetPublicLink()
{
     path = @"D:\Read\x.pdf";
    return new PhysicalFileResult(path, "application/pdf");
}
于 2019-10-18T06:26:48.643 回答