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 添加到响应中,文件名是:
- Returning a file to View/Download in ASP.NET MVC
- Make a file open in browser instead of downloading it
但这行不通。
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,选项卡标题是域)。
在我的应用程序中,我有一个文件夹结构,您可以在其中上传各种文件(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 添加到响应中,文件名是:
- Returning a file to View/Download in ASP.NET MVC
- Make a file open in browser instead of downloading it
但这行不通。
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,选项卡标题是域)。