asp.net-mvc-3 – 如何避免使用MVC3 FileContentResult重复内容处理头?
|
我们有一些文件存储在sql数据库中.在ASP.NET MVC3表单上,我们显示2个链接: 查看此文件|下载此文件 这些链接到这些相应的动作方法.下载按预期工作 – 点击链接强制在浏览器中保存对话框.但是,显示屏会导致重复的Content-Disposition标头被发送到浏览器,导致Chrome上出现错误,Firefox中显示一个空白页面. [ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId,string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
Response.AddHeader("Content-Disposition",string.Format("inline; filename={0}",file.Name));
return File(file.Content,file.MimeType,file.Name);
}
}
[ActionName("download-file")]
public virtual ActionResult DownloadFile (Guid fileId,string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
return File(file.Content,file.Name);
}
}
以下是发送到浏览器进行显示操作的2个标题: Content-Disposition: inline; filename=name-of-my-file.pdf Content-Disposition: attachment; filename="name-of-my-file.pdf" 我尝试更改我的自定义内容处理标题,以双引号将文件名包装起来,但仍然向浏览器发送2个标题.在添加自定义头文件之前,我也尝试删除了Content-Disposition头文件,但是在返回FileContentResult之后,会出现附加头标题. 这段代码用于工作.我昨天进行了测试,注意到它已经不再适用于Chrome或Firefox.这可能是由于浏览器中的更新. IE8和Safari仍然正确打开文件. 更新 再次感谢达琳,你是对的.我们实际上使用这种方法,因为another question you answered. 有关如何最终解决这个问题的更多信息,我们有一个自定义路径显示文件链接: context.MapRoute(null,"path/to/display-file-attachment/{fileId}/{fileName}",new
{
area = "AreaName",controller = "ControllerName",action = "DisplayFile",}
);
页面上的超链接通过route参数将文件名传递给action方法,因此它已经是URL的一部分.因此,我们不需要添加自定义内容处理标题,以便在用户决定下载文件名时与文件名匹配(通过单击浏览器PDF查看器中的保存图标).所以我们只是用这个: [ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId,string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
// no custom content-disposition header,and no 3rd fileName argument
return File(file.Content,file.MimeType);
}
}
解决方法当您使用重载File(byte [] contents,string mimeType,string fileName)时,Content-Disposition头会自动添加到带有附件的响应中,因此您不需要再次添加它.对于内联,您可以使用以下重载文件(byte [] contents,string mimeType)并手动添加Content-Disposition标题:[ActionName("display-file")]
public virtual ActionResult DisplayFile(Guid fileId)
{
var file = _repos.GetFileInfo(fileId);
var cd = new ContentDisposition
{
Inline = true,FileName = file.Name
};
Response.AddHeader("Content-Disposition",cd.ToString());
return File(file.Content,file.MimeType);
}
[ActionName("download-file")]
public virtual ActionResult DownloadFile(Guid fileId)
{
var file = _repos.GetFileInfo(fileId);
return File(file.Content,file.Name);
} (编辑:日照站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将mvc 5应用程序连接到Azure中的ACS?
- asp.net-mvc – LiveReload ASP.net MVC Web应用程序与Grun
- 使用asp.net控件创建无序列表?
- asp.net-core – .NET Core SDK安装程序无法在Windows 2012
- asp.net – 如何打破VB.NET中的“if”块
- ASP.NET:隐藏gridview中的列
- asp.net-mvc-3 – 在使用Unity容器时为此对象异常定义的无参
- asp.net-mvc – 使用html.actionlink将模型从视图传递到控制
- 显示下载进度条的下载文件代码
- asp.net-mvc – 使用Razor视图引擎 – 如何格式化十进制值以
- asp.net – 请求在IIS工作进程中存在于RequestAc
- asp.net-mvc-3 – 如何从ASP.NET MVC#输出中删除
- asp.net-mvc – 从扩展Apicontroller的MVC控制器
- asp.net-web-api – WebApi2属性路由404
- ASP.Net 2中的上传文件在哪里?
- asp.net – 网站在解决方案构建后需要很长时间才
- asp.net-mvc – 根据浏览器接受语言自动设置uiCu
- asp.net-mvc – 无法在Web服务器上启动调试. Web
- azure – 获取#error = unsupported_response_ty
- asp.net 文章内容分页显示的代码
