ASP.Net MVC:在浏览器中显示文件,在浏览器选项卡中显示文件名

ASP.Net MVC: Display file in browser, show filename in browser tab

在我的应用程序中,我有一个文件夹结构,您可以在其中上传各种文件(jpg、png、pdf、txt 等)。您可以直接将它们下载为文件,也可以在浏览器中查看文件。

为了在浏览器中显示文件,我使用了以下控制器操作:

    public virtual ActionResult FileDisplay(int fileId, bool isFile)
    {
        var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
        return base.File(viewmodel.Data, viewmodel.MediaType);
    }

文件在浏览器中显示如下: https://i.stack.imgur.com/TXmTy.jpg

浏览器选项卡显示我的控制器名称 "FileDisplay" 和(对于此示例)图像的尺寸。

问题: 如何在浏览器选项卡标题中显示文件名而不是控制器名称?这适用于所有文件类型。

1. Content-Dispostionheader

我找到了几篇帖子,他们说要将 Content-Disposition header 添加到响应中,文件名是:

但这行不通。

2。将文件名添加到文件构造函数

return base.File(viewmodel.Data, viewmodel.MediaType, viewmodel.FileName);

如果我这样做,文件将被下载而不是显示在浏览器中。

3。 PDF 文件标题

我发现有时浏览器标签标题是正确的!如果我在浏览器中显示具有文件标题(pdf 属性中的标题,而不是文件名)的 PDF 文件,则浏览器标题是正确的: https://i.stack.imgur.com/orAZS.jpg

有人可以帮我解决这个问题吗?

试试这个:-

public virtual ActionResult FileDisplay(int fileId, bool isFile)
{
    var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
    ViewBag.Title= viewmodel.FileName;
    return base.File(viewmodel.Data, viewmodel.MediaType);
}

目前的解决方法:

我使用全屏 iframe 创建了一个新的操作和视图,因此我可以设置此容器视图的标题。 IFrame 源正在直接调用我的文件。

    public virtual ActionResult FileDisplay(string fileName, int fileId, bool isFile)
    {
        var viewModel = new IFrameDocumentDisplayViewModel
        {
            FileName = fileName,
            FileId = fileId,
            IsFile = isFile
        };

        return PartialView("IFrameFileDisplayView", viewModel);
    }

    public virtual ActionResult GetFile(int fileId, bool isFile)
    {
        var viewmodel = _presenter.GetDocumentDisplayViewModel(fileId, isFile);
        return base.File(viewmodel.Data, viewmodel.MediaType);
    }

@model OnView.Models.ViewModels.Document.IFrameDocumentDisplayViewModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@Model.FileName</title>
</head>
<body>
    <iframe style="border: 0; position:absolute; top:0; left:0; right:0; bottom:0; width:100%; height:100%" src="@Html.Raw(Url.Action("GetFile", "Document", new { fileId = Model.FileId, isFile = Model.IsFile}))"></iframe>
</body>
</html>

现在我可以设置页面标题了。但是我还是很好奇没有IFrame怎么实现。

浏览器显示的选项卡标题是 URL 的最后一部分(浏览器不知道您的控制器名称是什么),因此您可以像这样重新格式化 url:

localhost/OnView.Web/Document/FileDisplay/1685/True/MyTabName

然后选项卡标题将是 MyTabName

但是为此目的更改整个 URL 架构似乎也是一种解决方法...

旁注:我有同样的问题,但我的 url 是这样的:FileDisplay/3?isFile=true 我的标签标题是 3(在 chrome。对于 IE,选项卡标题是域)。